TypeScript Academy · Pelajaran

Relasi dan Join dengan Jenis

Modelkan relasi agar hasil join memiliki jenis yang benar.

Pelajaran 4 dari 413 langkah

Relasi dan Join dengan Jenis adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 4 pelajaran total.

Relasi Bertipe dan Hasil Bersarang

Skema nyata memiliki relasi: seorang pengguna memiliki banyak posts, dan sebuah post dimiliki oleh seorang pengguna. ORM yang aman tipe memungkinkan Anda mendeklarasikan relasi ini, lalu mengembalikan hasil yang bersarang dan bertipe dengan tepat dari kueri relasional.

Mendeklarasikan Relasi

Di samping tabel, Anda mendefinisikan objek relasi yang menjelaskan cara tabel-tabel tersebut terhubung. Metadata ini menjadi dasar pembuatan SQL dan tipe hasil.

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],
  }),
}));

Kueri Relasional

API kueri memungkinkan Anda meminta baris terkait dengan with. Hasilnya menyarangkan data terkait di bawah nama relasi.

const result = await db.query.users.findMany({
  with: { posts: true },
});
// result: (User & { posts: Post[] })[]

one vs Banyak Menentukan Tipe

Relasi many menghasilkan larik; relasi one menghasilkan satu objek (atau NULL). Tipe bersarang sesuai dengan kardinalitas yang Anda deklarasikan.

const r = await db.query.posts.findMany({
  with: { author: true },
});
// r: (Post & { author: User })[]   // author is a single object

Memilih Kolom di Dalam Relasi

Anda dapat mempersempit baris induk maupun baris bersarang. Tipe hasil dipersempit secara mandiri pada setiap tingkat.

const r = await db.query.users.findMany({
  columns: { id: true, name: true },
  with: {
    posts: { columns: { title: true } },
  },
});
// r: { id: number; name: string; posts: { title: string }[] }[]

JOIN Manual dengan Kolom Bertipe

JOIN tingkat rendah juga tetap bertipe. Predikat JOIN menggunakan rujukan kolom bertipe, sedangkan select menentukan bentuk hasil datar.

const rows = await db
  .select({ author: users.name, title: posts.title })
  .from(posts)
  .innerJoin(users, eq(users.id, posts.authorId));
// rows: { author: string; title: string }[]

LEFT JOIN Memperkenalkan Kemungkinan NULL

LEFT JOIN dapat menghasilkan baris sisi kanan yang tidak ada, sehingga kolom yang digabungkan menjadi dapat bernilai NULL dalam tipe hasil. ORM mencerminkan hal ini secara otomatis.

const rows = await db
  .select({ name: users.name, title: posts.title })
  .from(users)
  .leftJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string | null }[]

Hasil Bersarang vs Datar

Kueri relasional (findMany + with) menghasilkan objek bersarang; JOIN manual menghasilkan baris datar. Pilih hasil bersarang saat Anda menginginkan graf objek, dan hasil datar saat Anda menginginkan proyeksi tabular.

Cara Menentukan Tipe Hasil Bersarang

Metadata relasi dibaca pada tingkat tipe. Tipe kueri menggabungkan baris dasar dengan objek yang kuncinya adalah relasi yang diminta; setiap relasi dipetakan ke tipe larik atau tipe tunggal sesuai kardinalitasnya.

type WithPosts = User & { posts: Post[] };
// "many" -> Post[], "one" -> User (or User | null for optional)

Relasi Bersarang Secara Mendalam

Relasi dapat dirangkai. Anda dapat meminta relasi dari sebuah relasi, dan tipe akan bersarang sedalam itu juga, semuanya disimpulkan secara otomatis.

await db.query.users.findMany({
  with: { posts: { with: { comments: true } } },
});
// User & { posts: (Post & { comments: Comment[] })[] }

Mengapa Ini Penting

Menentukan tipe hasil JOIN bersarang secara manual rentan terhadap kesalahan dan dapat menyimpang dari skema. Menurunkannya dari relasi yang dideklarasikan menjaga tipe graf objek dan SQL tetap selaras, sehingga penggantian nama relasi menjadi galat kompilasi, bukan kejutan di produksi.

Pemeriksaan Singkat

Uji pemahaman Anda tentang relasi dan JOIN bertipe.

Rangkuman

Anda mendeklarasikan relasi, lalu membiarkan ORM menghasilkan hasil bertipe yang bersarang: many menghasilkan larik, one menghasilkan satu objek, select parsial mempersempit setiap tingkat, LEFT JOIN memperkenalkan kemungkinan NULL, dan relasi yang bersarang secara mendalam dapat dirangkai. Metadata relasi menggerakkan SQL dan tipe hasil, sehingga keduanya tetap selaras.

Gratis untuk memulai

Belajar TypeScript dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
101
Pelajaran
352

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Relasi dan Join dengan Jenis” gratis?

Ya — teks lengkap “Relasi dan Join dengan Jenis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Relasi dan Join dengan Jenis”?

Modelkan relasi agar hasil join memiliki jenis yang benar. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Relasi dan Join dengan Jenis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pemetaan Skema ke Jenis
  2. Pembuatan Kueri yang Aman Secara Jenis
  3. Menyimpulkan Bentuk Hasil Kueri
  4. Relasi dan Join dengan Jenis
← Kembali ke TypeScript Academy