How to do a leftJoin on a pgArray of uuid?
export const Messages = pgTable("messages", {
id: uuid("id").defaultRandom().primaryKey(),
text: text("text").notNull(),
media: uuid("media_id")
.references(() => Media.id)
.array()
.default(sql`'{}'::uuid[]`),
});
export const Media = pgTable("media", {
id: uuid("id").defaultRandom().primaryKey(),
url: text("url").notNull(),
type: text("type").notNull(),
});
export const Messages = pgTable("messages", {
id: uuid("id").defaultRandom().primaryKey(),
text: text("text").notNull(),
media: uuid("media_id")
.references(() => Media.id)
.array()
.default(sql`'{}'::uuid[]`),
});
export const Media = pgTable("media", {
id: uuid("id").defaultRandom().primaryKey(),
url: text("url").notNull(),
type: text("type").notNull(),
});
**Messages**
--------------------------------------------------------
| id | text | media |
--------------------------------------------------------
| "message1" | "Hello" | ["media1", "media2"] |
--------------------------------------------------------
**Media**
---------------------------------------------
| id | url | type |
---------------------------------------------
| "media1" | "/profile.png" | "image/png" |
| "media2" | "/demo.gif" | "image/gif" |
---------------------------------------------
**Messages**
--------------------------------------------------------
| id | text | media |
--------------------------------------------------------
| "message1" | "Hello" | ["media1", "media2"] |
--------------------------------------------------------
**Media**
---------------------------------------------
| id | url | type |
---------------------------------------------
| "media1" | "/profile.png" | "image/png" |
| "media2" | "/demo.gif" | "image/gif" |
---------------------------------------------
[
{
"id": "message1",
"text": "Hello",
"media": [
{
"id": "media1",
"url": "/profile.png",
"type": "image/png"
},
{
"id": "media2",
"url": "/demo.gif",
"type": "image/gif"
},
]
}
]
[
{
"id": "message1",
"text": "Hello",
"media": [
{
"id": "media1",
"url": "/profile.png",
"type": "image/png"
},
{
"id": "media2",
"url": "/demo.gif",
"type": "image/gif"
},
]
}
]
1 Reply
Try this:
const result = await db
.select({
id: Messages.id,
text: Messages.text,
media: sql<
{
id: string;
url: string;
type: string;
}[]
>`COALESCE(json_agg(${Media}) FILTER (WHERE ${Media.id} IS NOT NULL), '[]'::json[])`
.as("media_items")
})
.from(Messages)
.leftJoin(Media, arrayContains(Messages.media, Media.id))
.groupBy(Messages.id);
const result = await db
.select({
id: Messages.id,
text: Messages.text,
media: sql<
{
id: string;
url: string;
type: string;
}[]
>`COALESCE(json_agg(${Media}) FILTER (WHERE ${Media.id} IS NOT NULL), '[]'::json[])`
.as("media_items")
})
.from(Messages)
.leftJoin(Media, arrayContains(Messages.media, Media.id))
.groupBy(Messages.id);