Was ist eine Relation?
Datenbanktabellen stehen häufig in Beziehung zueinander. So kann ein Blog-Beitrag viele Kommentare haben oder eine Bestellung mit dem Nutzer verknüpft sein, der sie aufgegeben hat. Eloquent stellt einen einfachen Mechanismus bereit, um solche Beziehungen (Relationen) zu definieren und mit ihnen zu arbeiten. Relationen werden als Methoden im Eloquent-Modell definiert.Auf dieser Seite dienen konkrete Modelle wie
User, Post, Comment und Tag als Beispiele.
Wir gehen davon aus, dass die Modelle und Tabellen bereits vorhanden sind.hasOne (1:1)
hasOne beschreibt, dass ein Modell genau eine Instanz eines anderen Modells besitzt. Zum Beispiel besitzt ein User genau ein Profile.
Relation definieren
Fügen Sie imUser-Modell eine Methode profile hinzu.
profiles eine Spalte user_id besitzt.
Verknüpfte Daten laden
Auf definierte Relationen greifen Sie wie auf Properties zu.belongsTo (Umkehrung der 1:1-Relation)
belongsTo ist die Umkehrung von hasOne und wird auf der Seite mit dem Fremdschlüssel definiert. Es beschreibt, dass Profile zu einem User gehört.
Relation definieren
_id als Fremdschlüsselspalte – hier also user_id.
Verknüpfte Daten laden
hasMany (1:n)
hasMany ist die am häufigsten genutzte Relation: Ein Elternmodell besitzt mehrere Kindmodelle. Zum Beispiel besitzt ein Post mehrere Comments.
Relation definieren
comments eine Spalte post_id besitzt.
Verknüpfte Daten laden
EinehasMany-Relation liefert eine Collection zurück.
Umkehrung (belongsTo)
Um vom Kommentar zum Beitrag zu navigieren, definieren Sie imComment-Modell belongsTo.
belongsToMany (n:m)
Eine n:m-Relation nutzen Sie, wenn beide Modelle jeweils mehrere Verknüpfungen haben können. Zum Beispiel: EinPost gehört zu mehreren Tags, und ein Tag gehört zu mehreren Posts.
Tabellenaufbau
Für eine n:m-Relation benötigen Sie eine Zwischentabelle. FürPost und Tag legen wir dazu post_tag an.
Den Namen der Zwischentabelle leitet Eloquent automatisch ab, indem die beiden Modellnamen alphabetisch verkettet werden (
post + tag → post_tag).Relation definieren
Tag-Seite, um sie in beide Richtungen abfragen zu können.
Verknüpfte Daten laden
Verknüpfte Datensätze hinzufügen und entfernen
Mitattach fügen Sie Einträge in die Zwischentabelle ein, mit detach entfernen Sie sie.
Eager Loading
Was ist das N+1-Problem?
Wenn Sie Relationen als Property abrufen, führt Eloquent bei jedem Zugriff eine eigene Query aus. Das nennt sich „Lazy Loading”. Greifen Sie in einer Schleife auf Relationen zu, entsteht das N+1-Problem.Eager Loading mit with()
Mit der Methodewith() laden Sie verknüpfte Daten in einem Rutsch, sodass insgesamt nur zwei Queries nötig sind.
Mehrere Relationen gleichzeitig Eager laden
Mit einem Array können Sie mehrere Relationen angeben.Verschachteltes Eager Loading
Mit Punkt-Notation können auch verschachtelte Relationen Eager geladen werden.Nächste Schritte
Einführung in Eloquent
Wiederholen Sie die grundlegenden CRUD-Operationen von Eloquent.