Wat zijn relaties?
Databasetabellen zijn vaak aan elkaar gerelateerd. Een blogpost heeft bijvoorbeeld veel reacties, of een bestelling is gerelateerd aan de gebruiker die haar heeft geplaatst. Eloquent biedt een mechanisme om zulke relaties tussen tabellen eenvoudig te definiëren en te gebruiken. Relaties definieer je als methoden op je Eloquent-modellen.Deze pagina gebruikt concrete modellen zoals
User, Post, Comment en Tag als voorbeeld.
We gaan ervan uit dat deze modellen en tabellen al zijn aangemaakt.hasOne (één-op-één)
hasOne beschrijft een relatie waarbij een model precies één ander model heeft. Bijvoorbeeld wanneer een User één Profile heeft.
De relatie definiëren
Definieer eenprofile-methode op het User-model.
profiles een kolom user_id heeft.
Gerelateerde data ophalen
Je kunt de gedefinieerde relatie benaderen als property.belongsTo (omgekeerde van één-op-één)
belongsTo is het omgekeerde van hasOne en definieer je op het model dat de foreign key heeft. Het beschrijft de relatie waarbij een Profile tot een User behoort.
De relatie definiëren
_id erachter (in dit geval user_id).
Gerelateerde data ophalen
hasMany (één-op-veel)
hasMany is de meest gebruikte relatie, waarbij één bovenliggend model meerdere onderliggende modellen heeft. Bijvoorbeeld wanneer één Post meerdere Comment-modellen heeft.
De relatie definiëren
comments een kolom post_id heeft.
Gerelateerde data ophalen
EenhasMany-relatie geeft een collectie terug.
De omgekeerde relatie (belongsTo)
Om vanuit een reactie naar de post te verwijzen, definieer jebelongsTo op het Comment-model.
belongsToMany (veel-op-veel)
Een veel-op-veel-relatie gebruik je wanneer beide modellen meerdere relaties met elkaar hebben. Bijvoorbeeld wanneer eenPost meerdere Tag-modellen heeft en een Tag ook bij meerdere Post-modellen hoort.
Tabelstructuur
Voor veel-op-veel heb je een tussentabel nodig. In het geval vanPost en Tag maak je een tussentabel genaamd post_tag.
De naam van de tussentabel leidt Eloquent automatisch af door de namen van de twee gerelateerde modellen in alfabetische volgorde samen te voegen (
post + tag → post_tag).De relatie definiëren
Tag-kant, kun je ook in omgekeerde richting verwijzen.
Gerelateerde data ophalen
Gerelateerde data toevoegen en verwijderen
Metattach voeg je records toe aan de tussentabel, met detach verwijder je ze.
Eager loading
Wat is het N+1-probleem?
Wanneer je een relatie als property benadert, voert Eloquent telkens een query uit. Dit heet “lazy loading”. Als je binnen een lus een relatie benadert, ontstaat het N+1-probleem.Eager loading met with()
Met dewith()-methode haal je gerelateerde data in één keer op. Zo blijft het aantal queries beperkt tot slechts twee.
Meerdere relaties tegelijk eager loaden
Je kunt meerdere relaties opgeven met een array.Genest eager loaden
Met de puntnotatie kun je ook geneste relaties eager loaden.Volgende stappen
Introductie tot Eloquent
Ga terug naar de basis-CRUD-bewerkingen van Eloquent om te herhalen.