Skip to main content

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.
De belangrijkste relaties die Eloquent ondersteunt zijn:

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 een profile-methode op het User-model.
Eloquent leidt de foreign key automatisch af uit de naam van het bovenliggende model. In dit geval wordt aangenomen dat de tabel profiles een kolom user_id heeft.

Gerelateerde data ophalen

Je kunt de gedefinieerde relatie benaderen als property.
Wanneer je een relatiemethode als property aanroept, voert Eloquent automatisch een query uit en geeft het de gerelateerde data terug. Dit heet een “dynamische relatieproperty”.

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

Eloquent gebruikt als foreign key de kolomnaam die bestaat uit de relatiemethodenaam met _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

Eloquent gaat ervan uit dat de tabel comments een kolom post_id heeft.

Gerelateerde data ophalen

Een hasMany-relatie geeft een collectie terug.
Je kunt ook voorwaarden aan de query toevoegen.

De omgekeerde relatie (belongsTo)

Om vanuit een reactie naar de post te verwijzen, definieer je belongsTo 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 een Post 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 van Post 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 + tagpost_tag).

De relatie definiëren

Door hetzelfde te definiëren aan de Tag-kant, kun je ook in omgekeerde richting verwijzen.

Gerelateerde data ophalen

Gerelateerde data toevoegen en verwijderen

Met attach voeg je records toe aan de tussentabel, met detach verwijder je ze.
Met sync worden tussentabelrecords met andere ID’s dan de opgegeven ID’s automatisch verwijderd, zodat alleen de doorgegeven ID’s als relatie overblijven.

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.
Bij 100 posts worden in totaal 101 queries uitgevoerd. Dit heeft een grote impact op de prestaties.

Eager loading met with()

Met de with()-methode haal je gerelateerde data in één keer op. Zo blijft het aantal queries beperkt tot slechts twee.
Er worden maar twee SQL-queries uitgevoerd:

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.
Eager loading is zeer belangrijk om het N+1-probleem te voorkomen. Maak er een gewoonte van om altijd with() te gebruiken wanneer je binnen een lus relaties benadert.

Volgende stappen

Introductie tot Eloquent

Ga terug naar de basis-CRUD-bewerkingen van Eloquent om te herhalen.
Laatst gewijzigd op 6 september 2026