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:
-
Eén-op-een (One-to-One)
hasOne(): Gebruikt in het model dat "bezit" heeft op de relatie (bijvoorbeeld,UserheeftPhone).belongsTo(): Gebruikt in het model dat "behoort" tot een ander model (bijvoorbeeld,Phonebehoort totUser).
-
Eén-naar-veel (One-to-Many)
hasMany(): Gebruikt in het model dat meerdere gerelateerde modellen kan hebben (bijvoorbeeld,Userheeft veelPost).belongsTo(): Gebruikt in het model dat behoort tot meerdere gerelateerde modellen (omgekeerde richting, bijvoorbeeld,Postbehoort totUser).
-
Veel-naar-veel (Many-to-Many)
belongsToMany(): Gebruikt aan beide zijden van de relatie via een tussentabel (bijvoorbeeld,Postheeft veelTag, enTagheeft veelPost, verbonden via de tabelpost_tag).
-
Eén-op-een (polymorfisch) (One-to-One Polymorphic)
morphOne(): Gebruikt in het model dat kan behoren tot verschillende typen gerelateerde modellen (bijvoorbeeld,PostofUserhebbenImage).morphTo(): Gebruikt in het polymorfe gerelateerde model (Image) om te bepalen tot welk model het behoort (PostofUser).
-
Eén-naar-veel (polymorfisch) (One-to-Many Polymorphic)
morphMany(): Gebruikt in het model dat veel gerelateerde modellen van verschillende types kan hebben (bijvoorbeeld,PostofCommenthebben veelImage).morphTo(): Gebruikt in het polymorfe gerelateerde model (Image) om te bepalen tot welk model het behoort (PostofComment).
-
Veel-naar-veel (polymorfisch) (Many-to-Many Polymorphic)
morphToMany(): Gebruikt aan beide zijden van de relatie via een polymorfe tussentabel (bijvoorbeeld,PostofVideokunnen veelTaghebben, verbonden via de tabeltaggables).morphedByMany(): Gebruikt in het gerelateerde model (Tag) om te bepalen tot welke modeltypes het kan worden gekoppeld (PostofVideo).
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.