{"id":53046,"date":"2023-06-07T19:19:26","date_gmt":"2023-06-07T17:19:26","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=53046&#038;preview=true&#038;preview_id=53046"},"modified":"2023-06-26T09:49:16","modified_gmt":"2023-06-26T07:49:16","slug":"laravel-relaties","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/","title":{"rendered":"Relaties in Laravel Eloquent: Een gids voor gevorderden"},"content":{"rendered":"<p>Vaak komt er een punt in het leven van elke developer waar je interactie nodig hebt met een database. Op dit vlak maakt Eloquent, de Object Relational Mapper (ORM) van Laravel, het proces van interactie met je databasetabellen intu\u00eftief en natuurlijk.<\/p>\n<p>Het is van vitaal belang dat je als professional de zes belangrijkste relatietypes herkent en begrijpt. En je hebt geluk, want we zullen we allemaal doornemen en bespreken.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Wat zijn relaties in Eloquent?<\/h2>\n<p>Bij het werken met tabellen in een relationele database kunnen we relaties karakteriseren als verbindingen tussen tabellen. Ze helpen je om gegevens moeiteloos te organiseren en te structureren, wat zorgt voor een superieure leesbaarheid en verwerking van gegevens. In de praktijk zijn er drie soorten databaserelaties:<\/p>\n<ul>\n<li>one-to-one &#8211; E\u00e9n record in een tabel is geassocieerd met \u00e9\u00e9n, en slechts \u00e9\u00e9n, in een andere tabel. Bijvoorbeeld een persoon en een burgerservicenummer.<\/li>\n<\/ul>\n<ul>\n<li>one-to-many &#8211; Een record is gekoppeld aan meerdere records in een andere tabel. Bijvoorbeeld een schrijver en zijn blogs.<\/li>\n<\/ul>\n<ul>\n<li>many-to-many &#8211; Meerdere records in een tabel zijn gekoppeld aan meerdere records in een andere tabel. Bijvoorbeeld studenten en de cursussen waarvoor ze zijn ingeschreven.<\/li>\n<\/ul>\n<p>Laravel maakt het naadloos om databaserelaties op te zetten en te beheren met behulp van objectgeori\u00ebnteerde syntaxis in Eloquent.<\/p>\n<p>Naast deze definities introduceert Laravel nog meer relaties, namelijk:<\/p>\n<ul>\n<li>Has-many through<\/li>\n<li>Polymorphic relaties<\/li>\n<li>Many-to-many polymorph<\/li>\n<\/ul>\n<p>Neem bijvoorbeeld een winkel waarvan de voorraad een verscheidenheid aan artikelen bevat, elk in een eigen categorie. Het is het vanuit zakelijk oogpunt zinvol om de database op te splitsen in meerdere tabellen. Dit geeft zijn eigen problemen, omdat je niet elke afzonderlijke tabel wilt query&#8217;en.<\/p>\n<p>We kunnen eenvoudig een one-to-many relatie maken in Laravel om ons te helpen, bijvoorbeeld als we de producten moeten query&#8217;en, kunnen we dat doen door het Product model te gebruiken.<\/p>\n<figure style=\"width: 1158px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/05\/pasted-image-0-6.png\" alt=\"Database schema met drie tabellen en een gezamenlijke tabel die een polymorfe relatie vertegenwoordigt\" width=\"1158\" height=\"610\"><figcaption class=\"wp-caption-text\">Database schema met drie tabellen en een gezamenlijke tabel die een polymorphic relatie vertegenwoordigt<\/figcaption><\/figure>\n<h2>One-to-one relatie<\/h2>\n<p>Dit is eerste basisrelatie die Laravel aanbiedt. Hierbij worden twee tabellen op zo&#8217;n manier geassocieerd dat een rij uit de eerste tabel is gecorreleerd met slechts \u00e9\u00e9n rij uit de andere tabel.<\/p>\n<p>Om dit in actie te zien, moeten we twee modellen maken met hun eigen migratie:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Tenant \nPhp artisan make:model Rent<\/code><\/pre>\n<p>We hebben nu twee modellen, waarvan de ene de Tenant is en de andere de Rent.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Tenant extends Model\n{\n    \/**\n    * Get the rent of a Tenant\n    *\/\n    public function rent() \n    {\n        return $this-&gt;hasOne(Rent::class);\n    }\n}<\/code><\/pre>\n<p>Omdat Eloquent de foreign key relatie bepaalt op basis van de naam van het bovenliggende model (Tenant in dit geval), gaat het Rent model ervan uit dat er een <strong>tenant_id<\/strong> foreign key bestaat.<\/p>\n<p>We kunnen dit eenvoudig overschrijven met een extra argument voor de <strong>hasOne<\/strong> methode:<\/p>\n<pre><code class=\"language-php\">return $this- &gt;hasOne(Rent::class, \"custom_key\");<\/code><\/pre>\n<p>Eloquent gaat er ook van uit dat er een overeenkomst is tussen de gedefinieerde foreign key en de primary key van de parent (Tenant model). Standaard wordt gekeken of <strong>tenant_id<\/strong> overeenkomt met de <strong>id<\/strong> sleutel van het Tenant record. We kunnen dit overschrijven met een derde argument in de <strong>hasOne<\/strong> methode, zodat het overeenkomt met een andere key:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class, \"custom_key\", \"other_key\"); <\/code><\/pre>\n<p>Nu we de one-to-one relatie tussen de modellen hebben gedefinieerd, kunnen we deze eenvoudig gebruiken, zoals dit:<\/p>\n<pre><code class=\"language-php\">$rent = Tenant::find(10)-&gt;rent;<\/code><\/pre>\n<p>Met deze regel code krijgen we de huur van de huurder met id 10 als die bestaat.<\/p>\n<h2>One-to-many relatie<\/h2>\n<p>Net als de vorige relatie defini\u00ebren we hier relaties tussen een model met \u00e9\u00e9n parent en meerdere modellen met children. Het is onwaarschijnlijk dat onze huurder (tenant) maar \u00e9\u00e9n keer huur (rent) heeft overgemaaktheeft, omdat het een terugkerende betaling is.<\/p>\n<p>In dit geval heeft onze vorige relatie fouten en die kunnen we herstellen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Tenant extends Model\n{\n    \/**\n    * Get the rents of a Tenant\n    *\/\n    public function rent() \n    {\n        return $this-&gt;hasMany(Rent::class);\n    }\n}<\/code><\/pre>\n<p>Voordat we de methode callen om de huren te krijgen, is het goed om te weten dat relaties dienen als querybouwers, dus we kunnen verdere beperkingen toevoegen (zoals huur tussen twee data, minimale betaling, etc.) en ze aan elkaar koppelen om ons gewenste resultaat te krijgen:<\/p>\n<pre><code class=\"language-php\">$rents = Tenant::find(10)-&gt;rent()-&gt;where('payment', '&gt;', 500)-&gt;first();<\/code><\/pre>\n<p>En net als bij de vorige relatie kunnen we de foreign en local keys overschrijven door extra argumenten door te geven:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasMany(Rent::class, \"foreign_key\");<\/code><\/pre>\n<pre><code class=\"language-php\">return $this-&gt;hasMany(Rent::class, \"foreign_key\", \"local_key\");<\/code><\/pre>\n<p>Nu hebben we alle huur van een huurder, maar wat doen we als we de huur weten en willen uitzoeken aan wie deze toebehoort? We kunnen gebruik maken van de property <strong>belongsTo <\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Rent extends Model\n{\n    \/**\n    * Return the tenant for the rent\n    *\/\n    public function tenant() \n    {\n        return $this-&gt;belongsTo(Tenant::class);\n    }\n}<\/code><\/pre>\n<p>En nu kunnen we de huurder gemakkelijk achterhalen:<\/p>\n<pre><code class=\"language-php\">$tenant = Rent::find(1)-&gt;tenant;<\/code><\/pre>\n<p>Voor de <strong>belongsTo<\/strong> methode kunnen we ook de foreign en local keys overschrijven zoals we eerder deden.<\/p>\n<h2>Has-one-of-many<\/h2>\n<p>Aangezien ons Tenant model kan worden geassocieerd met veel Tenant modellen, willen we gemakkelijk het laatste of oudste gerelateerde model van de relaties ophalen.<\/p>\n<p>Een handige manier om dit te doen is door de methoden <strong>hasOne<\/strong> en <strong>ofMany<\/strong> te combineren:<\/p>\n<pre><code class=\"language-php\">public function latestRent() {\n    return $this-&gt;hasOne(Rent::class)-&gt;latestOfMany();\n}\n\npublic function oldestRent() {\n    return $this-&gt;hasOne(Rent::class)-&gt;oldestOfMany();\n}<\/code><\/pre>\n<p>Standaard krijgen we de gegevens op basis van de primary key, die sorteerbaar is, maar we kunnen onze eigen filters maken voor de <strong>ofMany<\/strong> methode:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class)-&gt;ofMany('price', 'min');<\/code><\/pre>\n<h2>HasOneThrough en HasManyThrough relaties<\/h2>\n<p>De <strong>-Through <\/strong>methodes suggereren dat onze modellen door een ander model moeten gaan om een relatie te leggen met het gewenste model. We kunnen bijvoorbeeld de Rent koppelen aan de Landlord, maar de Rent moet eerst door de Tenant om bij de Landlord te komen.<\/p>\n<p>De keys van de tabellen die hiervoor nodig zijn, zien er als volgt uit:<\/p>\n<pre><code class=\"language-bash\">rent\n    id - integer\n    name - string\n    value - double\n\ntenants\n    id - integer\n    name - string\n    rent_id - integer\n\nlandlord\n    id - integer\n    name - string\n    tenant_id - integer<\/code><\/pre>\n<p>Nadat we hebben gevisualiseerd hoe onze tabellen eruit zien, kunnen we de modellen maken:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Rent extends Model\n{\n    \/**\n    * Return the rents' landlord\n    *\/\n    public function rentLandlord() \n    {\n        return $this-&gt;hasOneThrough(Landlord::class, Tenant::class);\n    }\n}<\/code><\/pre>\n<p>Het eerste argument van de methode <strong>hasOneThrough<\/strong> is het model dat je wilt benaderen, en het tweede argument is het model waar je doorheen gaat.<\/p>\n<p>En net als eerder kun je de foreign en local keys overschrijven. Nu we twee modellen hebben, hebben we er twee van elk om te overschrijven in deze volgorde:<\/p>\n<pre><code class=\"language-php\">public function rentLandlord() \n{\n    return $this-&gt;hasOneThrough(\n        Landlord::class,\n        Tenant::class,\n        \"rent_id\",    \/\/ Foreign key on the tenant table\n        \"tenant_id\",  \/\/ Foreign key on the landlord table\n        \"id\",         \/\/ Local key on the tenant class\n        \"id\"          \/\/ Local key on the tenant table\n    );\n}<\/code><\/pre>\n<p>Op dezelfde manier is de &#8220;Has Many Through&#8221; relatie in Laravel Eloquent handig als je records in een distant tabel wilt benaderen via een intermediate tabel. Laten we eens kijken naar een voorbeeld met drie tabellen:<\/p>\n<ul>\n<li>country<\/li>\n<li>user<\/li>\n<li>games<\/li>\n<\/ul>\n<p>Elk land (country) heeft veel gebruikers (users) en elke gebruiker heeft veel spellen (games). We willen alle spellen van een land ophalen via de User tabel.<\/p>\n<p>Je zou de tabellen als volgt defini\u00ebren:<\/p>\n<pre><code class=\"language-bash\">country\n    id - integer\n    name - string\n\nuser\n    id - integer\n    country_id - integer\n    name - string\n\ngames\n    id - integer\n    user_id - integer\n    title - string<\/code><\/pre>\n<p>Nu moet je voor elke tabel het Eloquent model defini\u00ebren:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Country extends Model\n{\n    protected $fillable = ['name'];\n\n    public function users()\n    {\n        return $this-&gt;hasMany(User::class);\n    }\n\n    public function games()\n    {\n        return $this-&gt;hasManyThrough(Games::class, User::class);\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass User extends Model\n{\n    protected $fillable = [article_id, 'name'];\n\n    public function country()\n    {\n        return $this-&gt;belongsTo(Country::class);\n    }\n\n    public function posts()\n    {\n        return $this-&gt;hasMany(Post::class);\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Game extends Model\n{\n    protected $fillable = ['user_id', 'title'];\n\n    public function user()\n    {\n        return $this-&gt;belongsTo(User::class);\n    }\n}<\/code><\/pre>\n<p>Nu kunnen we de <strong>games() <\/strong>methode van het Country model callen om alle games te krijgen, omdat we de &#8220;Has Many Through&#8221; relatie tussen Country en Game hebben gelegd via het User model.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n$country = Country::find(159);\n            \n\/\/ Retrieve all games for the country\n$games = $country-&gt;games;<\/code><\/pre>\n<h2>Many-to-many relatie<\/h2>\n<p>De many-to-many relatie is ingewikkelder. Een goed voorbeeld is een medewerker (employee) die meerdere rollen heeft. Ook een rol kan worden toegewezen aan meerdere medewerkers. Dit is de basis van de many-to-many relatie.<\/p>\n<p>Hiervoor hebben we de tabellen <strong>employees<\/strong>, <strong>roles<\/strong>\u00a0en <strong>role_employees <\/strong>nodig.<\/p>\n<p>De tabelstructuur van onze database ziet er als volgt uit:<\/p>\n<pre><code class=\"language-bash\">employees\n    id - integer\n    name - string\n\nroles \n    id - integer\n    name - string\n\nrole_employees\n    user_id - integer\n    role_id - integer<\/code><\/pre>\n<p>Als we de tabellenstructuur van de relatie kennen, kunnen we eenvoudig ons <b>Employee model <\/b>defini\u00ebren als <strong>belongToMany<\/strong> <strong>Role model<\/strong>.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Employee extends Model\n{\n    public function roles() \n    {\n        return $this- &gt;belongsToMany(Role::class);\n    }\n}<\/code><\/pre>\n<p>Zodra we dit gedefinieerd hebben, kunnen we alle rollen van een werknemer callen en zelfs filteren:<\/p>\n<pre><code class=\"language-php\">$employee = Employee::find(1);\n$employee-&gt;roles-&gt;forEach(function($role) { \/\/ });\n\n\/\/ OR \n\n$employee = Employee::find(1)-&gt;roles()-&gt;orderBy('name')-&gt;where('name', 'admin')-&gt;get();<\/code><\/pre>\n<p>Net als alle andere methoden kunnen we de foreign en local keys van de <strong>belongsToMany<\/strong> methode overschrijven.<\/p>\n<p>Om de omgekeerde relatie van <strong>belongsToMany<\/strong> te defini\u00ebren, gebruiken we gewoon dezelfde methode, maar nu op de child methode, met de parent als argument.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Role extends Model\n{\n    public function employees() \n    {\n        return $this-&gt;belongsToMany(Employee::class);\n    }\n}<\/code><\/pre>\n<h3>Gebruik van de intermediate tabel<\/h3>\n<p>Zoals we misschien hebben gemerkt, moeten we altijd een intermediate hebben als we de many-to-many relatie gebruiken. In dit geval gebruiken we de tabel <strong>role_employees<\/strong>.<\/p>\n<p>Standaard zal onze tabel alleen de id attributen bevatten. Als we andere attributen willen, moeten we ze als volgt specificeren:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withPivot(\"active\", \"created_at\");<\/code><\/pre>\n<p>Als we de pivot voor de tijdstempels willen verkorten, kunnen we dat doen:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withTimestamps();<\/code><\/pre>\n<p>Een truc om te weten is dat we de naam &#8216;pivot&#8217; kunnen aanpassen in iets dat beter past bij onze applicatie:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;as('subscription')-&gt;withPivot(\"active\", \"created_by\");<\/code><\/pre>\n<p>Het filteren van de resultaten van een eloquent query is een must voor elke developer die zijn <a href=\"https:\/\/kinsta.com\/nl\/blog\/prestaties-laravel\/\">Laravel applicaties wil optimaliseren<\/a>.<\/p>\n<p>Daarom biedt Laravel een fantastische functie van pivots die kunnen worden gebruikt om de gegevens te filteren die we willen verzamelen. Dus in plaats van andere functies zoals <a href=\"https:\/\/kinsta.com\/blog\/laravel-database\/\">databasetransacties<\/a> te gebruiken om onze gegevens in chunks te krijgen, kunnen we ze filteren met handige methoden zoals <strong>wherePivot, wherePivotIn, wherePivotNotIn, wherePivotBetween, wherePivotNotBetween, wherePivotNull, wherePivotNotNull<\/strong> en we kunnen ze gebruiken bij het defini\u00ebren van relaties tussen tabellen!<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;wherePivot('promoted', 1);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotIn('level', [1, 2]);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNotIn('level', [2, 3]);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotBetween('posted_at', ['2023-01-01 00:00:00', '2023-01-02 00:00:00']);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNull('expired_at');\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNotNull('posted_at');<\/code><\/pre>\n<p>Een laatste geweldige feature is dat we kunnen ordenen op pivots:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)\n        -&gt;where('promoted', true)\n        -&gt;orderByPivot('hired_at', 'desc');<\/code><\/pre>\n<h2>Polymorphic relaties<\/h2>\n<p>Het woord polymorph (polymorf) komt uit het Grieks en betekent &#8220;vele vormen&#8221; Zo kan \u00e9\u00e9n model in onze applicatie vele vormen aannemen, wat betekent dat het meer dan \u00e9\u00e9n associatie kan hebben. Stel je voor dat we een applicatie bouwen met blogs, video&#8217;s, polls, enz. Een gebruiker kan voor elk van deze een opmerking maken. Daarom kan een <b>Comment model <\/b>bij de modellen <strong>Blogs<\/strong>, <strong>Video&#8217;s<\/strong> en <strong>Polls<\/strong> horen.<\/p>\n<h2>Polymorphic one-to-one<\/h2>\n<p>Dit type relatie is vergelijkbaar met een standaard one-to-one relatie. Het enige verschil is dat het child model bij meer dan \u00e9\u00e9n type model kan horen met een enkele associatie.<\/p>\n<p>Neem bijvoorbeeld een <strong>Tenant <\/strong>en <b>Landlord <\/b>model, het kan een polymorphic relatie delen met een <b>Waterbills <\/b>model.<\/p>\n<p>De tabelstructuur kan er als volgt uitzien:<\/p>\n<pre><code class=\"language-bash\">tenants\n    id \u2013 integer\n    name \u2013 string\n\nlandlords\n    id \u2013 integer\n    name \u2013 string\n\nwaterbills\n    id \u2013 integer\n    amount \u2013 double\n    waterbillable_id\n    waterbillable_type<\/code><\/pre>\n<p>We gebruiken waterbillable_id voor de id van de <strong>landlord <\/strong>of <strong>tenant, <\/strong>terwijl de waterbillable_type de klassenaam van het parent model bevat. De type kolom wordt door eloquent gebruikt om uit te zoeken welk parent model moet worden geretourneerd.<\/p>\n<p>De modeldefinitie voor een dergelijke relatie ziet er als volgt uit:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass WaterBill extends Model\n{\n    public function billable()\n    {\n        return $this-&gt;morphTo();\n    }\n}\n\nclass Tenant extends Model\n{\n    public function waterBill()    \n    {\n        return $this-&gt;morphOne(WaterBill::class, 'billable');\n    }\n}\n\nclass Landlord extends Model\n{\n    public function waterBill()    \n    {\n        return $this-&gt;morphOne(WaterBill::class, 'billable');\n    }\n}<\/code><\/pre>\n<p>Als we dit allemaal voor elkaar hebben, kunnen we de gegevens van zowel het Landlord als het Tenant model gebruiken:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n$tenant = Tenant::find(1)-&gt;waterBill;\n$landlord = Landlord::find(1)-&gt;waterBill;<\/code><\/pre>\n<h2>Polymorphic one-to-many<\/h2>\n<p>Dit is vergelijkbaar met een gewone one-to-many relatie, het enige belangrijke verschil is dat het child model bij meer dan \u00e9\u00e9n type model kan horen, met behulp van \u00e9\u00e9n associatie.<\/p>\n<p>In een applicatie als Facebook kunnen gebruikers commentaar geven op berichten, video&#8217;s, polls, live, enz. Met een polymorphic one-to-many kunnen we een enkele <b>comments tabellen <\/b>gebruiken om de reacties op te slaan voor alle categorie\u00ebn die we hebben. Onze tabelstructuur zou er ongeveer zo uitzien:<\/p>\n<pre><code class=\"language-bash\">posts \n    id \u2013 integer\n    title \u2013 string\n    body \u2013 text\n\nvideos\n    id \u2013 integer\n    title \u2013 string\n    url \u2013 string\n\npolls\n    id \u2013 integer\n    title \u2013 string\n\ncomments \n    id \u2013 integer\n    body \u2013 text\n    commentable_id \u2013 integer\n    commentable_type \u2013 string<\/code><\/pre>\n<p>De commentable_id is de id van de record en de commentable_type is het klasse-type, zodat eloquent weet waar hij naar moet zoeken. De structuur van het model lijkt erg op de polymorphic one-to-many:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Comment extends Model \n{\n    public function commentable()\n    {\n        return $this-&gt;morphTo();\n    }\n}\n\nclass Poll extends Model\n{\n    public function comments()\n    {\n        return $this-&gt;morphMany(Comment::class, 'commentable');\n    }\n}\n\nclass Live extends Model\n{\n    public function comments()\n    {\n        return $this-&gt;morphMany(Comments::class, 'commentable');\n    }\n}<\/code><\/pre>\n<p>Om nu het commentaar van een Live op te halen, kunnen we gewoon de find methode callen met het id, en nu hebben we toegang tot de commentaar iterable klasse:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse AppModelsLive;\n\n$live = Live::find(1);\n\nforeach ($live-&gt;comments as $comment) { }\n\n\/\/ OR\n\nLive::find(1)-&gt;comments()-&gt;each(function($comment) { \/\/ });\nLive::find(1)-&gt;comments()-&gt;map(function($comment) { \/\/ });\nLive::find(1)-&gt;comments()-&gt;filter(function($comment) { \/\/ });\n\n\/\/ etc.<\/code><\/pre>\n<p>En als we het commentaar hebben en willen weten aan wie het toebehoort, dan hebben we toegang tot de commentable methode:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse AppModelsComment;\n\n$comment = Comment::find(10);\n$commentable = $comment-&gt;commentable;\n\n\/\/ commentable \u2013 type of Post, Video, Poll, Live<\/code><\/pre>\n<h2>Polymorphic one-of-many<\/h2>\n<p>In veel applicaties die schaalbaar zijn, willen we een gemakkelijke manier om te communiceren met modellen en tussen modellen. We willen misschien het eerste of laatste bericht van een gebruiker, wat kan worden gedaan met een combinatie van de methoden <strong>morphOne<\/strong> en <strong>ofMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function latestPost()\n{\n    return $this-&gt;morphOne(Post::class, 'postable')-&gt;latestOfMany();\n}\n\npublic function oldestPost()\n{\n    return $this-&gt;morphOne(Post::class, 'postable')-&gt;oldestOfMany();\n}<\/code><\/pre>\n<p>De methoden <strong>latestOfMany<\/strong> en <strong>oldestOfMany <\/strong>halen het nieuwste of oudste model op op basis van de primaire sleutel van het model, wat de voorwaarde was dat het sorteerbaar is.<\/p>\n<p>In sommige gevallen willen we niet sorteren op de ID, misschien hebben we de publicatiedatum van sommige berichten veranderd en willen we ze in die volgorde, niet op hun id.<\/p>\n<p>Dit kan worden gedaan door 2 parameters door te geven aan de <strong>ofMany<\/strong> methode om hierbij te helpen. De eerste parameter is de <b>key <\/b>waarop we willen filteren en de tweede is de <strong>sorting methode<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function latestPublishedPost()\n{\n    return $this-&gt;morphOne(Post::class, \"postable\")-&gt;ofMany(\"published_at\", \"max\");\n}<\/code><\/pre>\n<p>Met dit in gedachten is het mogelijk om hiervoor geavanceerdere relaties te construeren! Stel je voor dat we dit scenario hebben. We worden gevraagd om een lijst te genereren van alle huidige berichten in de volgorde waarin ze zijn gepubliceerd. Het probleem ontstaat wanneer we 2 berichten hebben met dezelfde published_at waarde en wanneer berichten gepland staan om in de toekomst geplaatst te worden.<\/p>\n<p>Om dit te doen, kunnen we de volgorde waarin we de filters willen toepassen doorgeven aan de <strong>ofMany<\/strong> methode. Op deze manier ordenen we op published_at en als ze hetzelfde zijn, ordenen we op id. Ten tweede kunnen we een query functie toepassen op de <strong>ofMany<\/strong> methode om alle berichten uit te sluiten die gepland staan om gepubliceerd te worden!<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function currentPosts()\n{\n    return $this-&gt;hasOne(Post::class)-&gt;ofMany([\n        'published_at' =&gt; 'max',\n        'id' =&gt; 'max',\n    ], function ($query) {\n        $query-&gt;where('published_at', '&lt;', now());\n    });\n}<\/code><\/pre>\n<h2>Polymorphic many-to-many<\/h2>\n<p>De polymorphic many-to-many is iets complexer dan de normale. Een veel voorkomende situatie is dat tags van toepassing zijn op meerdere assets binnen je applicatie. Op TikTok hebben we bijvoorbeeld tags die kunnen worden toegepast op video&#8217;s, shorts, verhalen, enz.<\/p>\n<p>Met de polymoprhic many-to-many kunnen we een enkele tabel hebben met tags die zijn gekoppeld aan de video&#8217;s, shorts en verhalen.<\/p>\n<p>De tabelstructuur is eenvoudig:<\/p>\n<pre><code class=\"language-bash\">videos\n    id \u2013 integer\n    description \u2013 string\n\nstories \n    id \u2013 integer\n    description \u2013 string\n\ntaggables \n    tag_id \u2013 integer\n    taggable_id \u2013 integer\n    taggable_type \u2013 string<\/code><\/pre>\n<p>Als de tabellen klaar zijn, kunnen we het model maken en de <strong>morphToMany<\/strong> methode gebruiken. Deze methode accepteert de naam van de modelklasse en de &#8216;relatienaam&#8217;:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Video extends Model\n{\n    public function tags()\n    {\n        return $this-&gt;morphToMany(Tag::class, 'taggable');\n    }\n}<\/code><\/pre>\n<p>En hiermee kunnen we eenvoudig de inverse relatie defini\u00ebren. We weten dat we voor elk child model de methode <strong>morphedByMany<\/strong> willen callen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Tag extends Model\n{\n    public function stories()\n    {\n        return $this-&gt;morphedByMany(Story::class, 'taggable');\n    }\n\n    public function videos()\n    {\n        return $this-&gt;morphedByMany(Video::class, 'taggable');\n    } \n}<\/code><\/pre>\n<p>En als we nu een Tag krijgen, kunnen we alle video&#8217;s en verhalen ophalen die met die Tag te maken hebben!<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse AppModelTag;\n\n$tag = Tag::find(10);\n$posts = $tag-&gt;stories;\n$videos = $tag-&gt;stories;<\/code><\/pre>\n<h2>Eloquent optimaliseren voor snelheid<\/h2>\n<p>Wanneer je met Laravels Eloquent ORM werkt, is het essentieel om te begrijpen hoe je databasequeries kunt optimaliseren en de hoeveelheid tijd en geheugen die nodig is om gegevens op te halen kunt minimaliseren. E\u00e9n manier om dit te doen is door <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-caching\/\">caching te implementeren <\/a>in je applicatie.<\/p>\n<p>Laravel biedt een flexibel cachingsysteem dat verschillende backends ondersteunt, zoals <a href=\"https:\/\/redis.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Redis<\/a>, <a href=\"https:\/\/memcached.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Memcached<\/a> en<a href=\"https:\/\/www.ibm.com\/docs\/en\/zvm\/7.1?topic=reference-file-caching\" target=\"_blank\" rel=\"noopener noreferrer\"> bestandsgebaseerde caching<\/a>. Door Eloquent queryresultaten te cachen, kun je het aantal databasequery&#8217;s verminderen, waardoor je applicatie sneller en waardevoller wordt.<\/p>\n<p>Bovendien kun je de <a href=\"https:\/\/laravel.com\/docs\/10.x\/queries\" target=\"_blank\" rel=\"noopener noreferrer\">query builder<\/a> van Laravel gebruiken om extra complexe query&#8217;s te maken, waardoor de prestaties van je applicatie nog verder worden geoptimaliseerd.<\/p>\n<h2>Samenvatting<\/h2>\n<p>Eloquent relaties zijn een krachtige feature van Laravel waarmee developers eenvoudig kunnen werken met gerelateerde gegevens. Van one-to-one tot many-to-many relaties, Eloquent biedt een eenvoudige en intu\u00eftieve syntaxis om deze relaties te defini\u00ebren en te query&#8217;en.<\/p>\n<p>Als Laravel deverloper kan het beheersen van Eloquent relaties je ontwikkelworkflow enorm verbeteren en je code effici\u00ebnter en leesbaarder maken. Als je meer wilt weten over Laravel, dan heeft Kinsta verschillende bronnen beschikbaar, waaronder een <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-tutorial\/\">tutorial<\/a> over aan de slag gaan met Laravel en een artikel over <a href=\"https:\/\/kinsta.com\/blog\/laravel-developer-salary\/\">de salarissen van Laravel developers<\/a>.<\/p>\n<p>Kinsta biedt Managed Hosting oplossingen die <a href=\"https:\/\/sevalla.com\/application-hosting\/\">het deployen en beheren van Laravel applicaties<\/a> een fluitje van een cent maken.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vaak komt er een punt in het leven van elke developer waar je interactie nodig hebt met een database. Op dit vlak maakt Eloquent, de Object &#8230;<\/p>\n","protected":false},"author":267,"featured_media":53047,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[866],"class_list":["post-53046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Relaties in Laravel Eloquent: Een gids voor gevorderden - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Relaties in Laravel Eloquent: Een gids voor gevorderden\" \/>\n<meta property=\"og:description\" content=\"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T17:19:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-26T07:49:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Coman Cosmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Relaties in Laravel Eloquent: Een gids voor gevorderden\",\"datePublished\":\"2023-06-07T17:19:26+00:00\",\"dateModified\":\"2023-06-26T07:49:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\"},\"wordCount\":2342,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\",\"name\":\"Relaties in Laravel Eloquent: Een gids voor gevorderden - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\",\"datePublished\":\"2023-06-07T17:19:26+00:00\",\"dateModified\":\"2023-06-26T07:49:16+00:00\",\"description\":\"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Relaties in Laravel Eloquent: Een gids voor gevorderden\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"caption\":\"Coman Cosmin\"},\"description\":\"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Relaties in Laravel Eloquent: Een gids voor gevorderden - Kinsta\u00ae","description":"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/","og_locale":"nl_NL","og_type":"article","og_title":"Relaties in Laravel Eloquent: Een gids voor gevorderden","og_description":"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.","og_url":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2023-06-07T17:19:26+00:00","article_modified_time":"2023-06-26T07:49:16+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","twitter_creator":"@Kinsta_NL","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Coman Cosmin","Geschatte leestijd":"14 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Relaties in Laravel Eloquent: Een gids voor gevorderden","datePublished":"2023-06-07T17:19:26+00:00","dateModified":"2023-06-26T07:49:16+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/"},"wordCount":2342,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/","url":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/","name":"Relaties in Laravel Eloquent: Een gids voor gevorderden - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","datePublished":"2023-06-07T17:19:26+00:00","dateModified":"2023-06-26T07:49:16+00:00","description":"Bij het werken met tabellen in een relationele database kunnen we relaties omschrijven als verbindingen tussen tabellen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/laravel-relationships.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-relaties\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/laravel\/"},{"@type":"ListItem","position":3,"name":"Relaties in Laravel Eloquent: Een gids voor gevorderden"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","caption":"Coman Cosmin"},"description":"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.","url":"https:\/\/kinsta.com\/nl\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=53046"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53046\/revisions"}],"predecessor-version":[{"id":53464,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53046\/revisions\/53464"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/translations\/nl"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53046\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/53047"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=53046"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=53046"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=53046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}