Sobes.tech
Middle

Hoe worden de relatie types geïmplementeerd in Laravel?

sobes.tech AI

Antwoord van AI

In Laravel worden relatie types tussen modellen geïmplementeerd via methoden die in de bijbehorende modellen zijn gedefinieerd. Deze methoden retourneren objecten van speciale klassen die het type relatie beschrijven.

De belangrijkste relatie types en hun methoden:

  1. Eén-op-een (One-to-One)

    • hasOne(): Gebruikt in het model dat "bezit" heeft op de relatie (bijvoorbeeld, User heeft Phone).
    • belongsTo(): Gebruikt in het model dat "behoort" tot een ander model (bijvoorbeeld, Phone behoort tot User).
  2. Eén-naar-veel (One-to-Many)

    • hasMany(): Gebruikt in het model dat meerdere gerelateerde modellen kan hebben (bijvoorbeeld, User heeft veel Post).
    • belongsTo(): Gebruikt in het model dat behoort tot meerdere gerelateerde modellen (omgekeerde richting, bijvoorbeeld, Post behoort tot User).
  3. Veel-naar-veel (Many-to-Many)

    • belongsToMany(): Gebruikt aan beide zijden van de relatie via een tussentabel (bijvoorbeeld, Post heeft veel Tag, en Tag heeft veel Post, verbonden via de tabel post_tag).
  4. Eén-op-een (polymorfisch) (One-to-One Polymorphic)

    • morphOne(): Gebruikt in het model dat kan behoren tot verschillende typen gerelateerde modellen (bijvoorbeeld, Post of User hebben Image).
    • morphTo(): Gebruikt in het polymorfe gerelateerde model (Image) om te bepalen tot welk model het behoort (Post of User).
  5. Eén-naar-veel (polymorfisch) (One-to-Many Polymorphic)

    • morphMany(): Gebruikt in het model dat veel gerelateerde modellen van verschillende types kan hebben (bijvoorbeeld, Post of Comment hebben veel Image).
    • morphTo(): Gebruikt in het polymorfe gerelateerde model (Image) om te bepalen tot welk model het behoort (Post of Comment).
  6. Veel-naar-veel (polymorfisch) (Many-to-Many Polymorphic)

    • morphToMany(): Gebruikt aan beide zijden van de relatie via een polymorfe tussentabel (bijvoorbeeld, Post of Video kunnen veel Tag hebben, verbonden via de tabel taggables).
    • morphedByMany(): Gebruikt in het gerelateerde model (Tag) om te bepalen tot welke modeltypes het kan worden gekoppeld (Post of Video).

Voorbeeld van implementatie van hasMany en belongsTo:

<?php

// app/Models/User.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    /**
     * Haal de posts van de gebruiker op.
     */
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
<?php

// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Post extends Model
{
    /**
     * Haal de gebruiker op die het bericht bezit.
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

Laravel gaat automatisch uit van de namen van de externe sleutels en de namen van gerelateerde tabellen op basis van de modelnamen. Deze aannames kunnen worden overschreven door extra argumenten door te geven aan de relatie-methoden. Bijvoorbeeld, hasMany(Post::class, 'author_id') geeft aan dat de externe sleutel in de tabel posts author_id heet.