Mendefinisikan relasi antar tabel dengan one() dan many(), melakukan nested relational queries dengan findMany dan with clause, serta kapan pakai relational queries vs SQL-like queries berdasarkan kompleksitas dan kebutuhan data.

Setelah di episode 6 kita mempelajari Advanced Select — filtering, sorting, pagination, dan aggregations — pada episode ini kita masuk ke relational queries: mendefinisikan relasi antar tabel dan melakukan nested queries yang mengambil data dari beberapa tabel sekaligus.
Relational queries adalah fitur yang membedakan Drizzle ORM dari sekadar query builder — ia memungkinkan kalian mendapatkan data yang sudah di-nested tanpa menulis JOIN manual.
import { relations } from 'drizzle-orm'
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}))
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, {
fields: [posts.authorId],
references: [users.id],
}),
}))many() — user punya banyak posts (one-to-many).one() — post punya satu author (many-to-one).fields — kolom di tabel ini yang menjadi foreign key.references — kolom di tabel target yang dirujuk.const usersWithPosts = await db.query.users.findMany({
with: {
posts: true,
},
})Hasilnya:
[
{
"id": 1,
"name": "John",
"posts": [
{ "id": 1, "title": "Hello World" },
{ "id": 2, "title": "Drizzle ORM" }
]
}
]const usersWithPopularPosts = await db.query.users.findMany({
with: {
posts: {
where: gt(posts.viewCount, 50),
orderBy: desc(posts.publishedAt),
limit: 5,
},
},
where: eq(users.isActive, true),
})const user = await db.query.users.findFirst({
with: {
posts: true,
},
where: eq(users.id, 1),
})| Aspek | Relational Queries | SQL-like Queries |
|---|---|---|
| Data shape | Nested (Prisma-like) | Flat atau custom join |
| Complexity | Sederhana hingga menengah | Kompleks, many-to-many |
| Performance | Sangat baik (optimized JOIN) | Full control |
| Use case | API responses, dashboard | Reports, analytics |
export const usersToGroups = pgTable('users_to_groups', {
userId: integer('user_id').references(() => users.id),
groupId: integer('group_id').references(() => groups.id),
})
export const usersRelations = relations(users, ({ many }) => ({
groups: many(usersToGroups),
}))Tip
Relational queries sangat cocok untuk API responses yang membutuhkan data nested. SQL-like queries lebih cocok untuk reports dan analytics yang membutuhkan custom joins dan aggregations kompleks. Keduanya bisa digunakan bersamaan dalam proyek yang sama.
Pada episode 7 ini, kalian telah memahami Relational Queries:
relations() mendefinisikan relasi antar tabel: one() dan many().findMany({ with: {...} }) untuk nested queries.where, orderBy, limit.Di episode 8 selanjutnya kita akan mempelajari SQL-like JOIN Queries — inner join, left join, multi-table join, dan join conditions. Sampai jumpa di episode 8!