TypeScript Academy · Lektion

Relationen und Joins mit Typen

Modellieren Sie Relationen, damit verknüpfte Ergebnisse korrekt typisiert sind.

Lektion 4 von 413 Schritte

Relationen und Joins mit Typen ist eine kostenlose TypeScript Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des TypeScript Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der TypeScript Academy-Kurs umfasst insgesamt 4 Lektionen.

Typisierte Relationen und verschachtelte Ergebnisse

Reale Schemata haben Relationen: Ein Benutzer hat viele Beiträge, und ein Beitrag gehört zu einem Benutzer. Ein typsicheres ORM ermöglicht es Ihnen, diese Relationen zu deklarieren und anschließend aus relationalen Abfragen korrekt verschachtelte, typisierte Ergebnisse zurückzugeben.

Relationen deklarieren

Zusätzlich zu den Tabellen definieren Sie ein Relationsobjekt, das beschreibt, wie sie miteinander verbunden sind. Diese Metadaten steuern sowohl die SQL-Erzeugung als auch den Ergebnistyp.

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

Eine relationale Abfrage

Über die Abfrage-API können Sie mit with verbundene Zeilen anfordern. Das Ergebnis verschachtelt die verbundenen Daten unter dem Relationsnamen.

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

one und many bestimmen den Typ

Eine many-Relation liefert ein Array, eine one-Relation ein einzelnes Objekt (oder null). Der verschachtelte Typ entspricht der von Ihnen deklarierten Kardinalität.

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

Spalten innerhalb von Relationen auswählen

Sie können sowohl die übergeordnete Zeile als auch die verschachtelten Zeilen einschränken. Der Ergebnistyp wird auf jeder Ebene unabhängig eingeschränkt.

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 }[] }[]

Manuelle Joins mit typisierten Spalten

Auch Joins auf niedrigerer Ebene bleiben typisiert. Die Join-Bedingung verwendet typisierte Spaltenreferenzen, und die Auswahl bestimmt die flache Ergebnisform.

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 führt Nullbarkeit ein

Ein LEFT JOIN kann fehlende Zeilen auf der rechten Seite erzeugen. Daher werden die verknüpften Spalten im Ergebnistyp nullable. Das ORM bildet dies automatisch ab.

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 }[]

Verschachtelte und flache Ergebnisse

Relationale Abfragen (findMany + with) liefern verschachtelte Objekte, manuelle Joins flache Zeilen. Wählen Sie verschachtelte Ergebnisse für Objektgraphen und flache Ergebnisse für tabellarische Projektionen.

So werden Verschachtelungen typisiert

Die Relationsmetadaten werden auf Typebene ausgelesen. Der Abfragetyp verbindet die Basiszeile mit einem Objekt, dessen Schlüssel den angeforderten Relationen entsprechen. Jede Relation wird entsprechend ihrer Kardinalität auf einen Array- oder Einzeltyp abgebildet.

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

Tief verschachtelte Relationen

Relationen lassen sich kombinieren. Sie können eine Relation einer Relation anfordern, und der Typ wird genauso tief verschachtelt – alles automatisch abgeleitet.

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

Warum das wichtig ist

Verschachtelte Join-Ergebnisse von Hand zu typisieren ist fehleranfällig und weicht leicht vom Schema ab. Werden sie aus deklarierten Relationen abgeleitet, bleiben der Typ des Objektgraphen und das SQL synchron. So wird das Umbenennen einer Relation zu einem Kompilierungsfehler statt zu einer Überraschung in der Produktion.

Kurzer Check

Testen Sie Ihr Verständnis von typisierten Relationen und Joins.

Zusammenfassung

Sie haben Relationen deklariert und anschließend das ORM verschachtelte, typisierte Ergebnisse erzeugen lassen: many liefert Arrays, one einzelne Objekte, partielle Auswahlen schränken jede Ebene ein, LEFT JOINs führen Nullbarkeit ein und tief verschachtelte Relationen lassen sich kombinieren. Die Relationsmetadaten steuern sowohl SQL als auch Ergebnistypen und halten beide synchron.

Kostenlos starten

Lerne TypeScript mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
101
Lektionen
352

Häufig gestellte Fragen

Ist die Lektion „Relationen und Joins mit Typen“ kostenlos?

Ja — der vollständige Text von „Relationen und Joins mit Typen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des TypeScript Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der TypeScript Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Relationen und Joins mit Typen“?

Modellieren Sie Relationen, damit verknüpfte Ergebnisse korrekt typisiert sind. Du übst TypeScript Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um TypeScript Academy zu starten?

Keine Vorkenntnisse erforderlich. TypeScript Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Relationen und Joins mit Typen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser TypeScript Academy-Lektion Code schreiben und ausführen?

Ja. Jede TypeScript Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Schema-zu-Typ-Zuordnung
  2. Typsichere Query-Erstellung
  3. Strukturen von Query-Ergebnissen ableiten
  4. Relationen und Joins mit Typen
← Zurück zu TypeScript Academy