Hogyan valósulnak meg a kapcsolat típusok a Laravelben?
sobes.tech MI
Válasz az MI-től
A Laravelben a modellek közötti kapcsolatok típusait a megfelelő modellekben meghatározott módszerek valósítják meg. Ezek a módszerek speciális osztályok példányait adják vissza, amelyek leírják a kapcsolat típusát.
A fő kapcsolat típusok és azok módszerei:
-
Egy az egyhez (One-to-One)
hasOne(): A modellt használja, amely "birtokol" egy kapcsolatot (pl.UserrendelkezikPhone-nal).belongsTo(): A modellt használja, amely "tartozik" egy másik modellhez (pl.PhonetartozikUser-hez).
-
Egy a sokhoz (One-to-Many)
hasMany(): A modellt használja, amely több kapcsolódó modellt is tartalmazhat (pl.User-nak sokPost-ja van).belongsTo(): A modellt használja, amely tartozik sok kapcsolódó modellhez (pl.PosttartozikUser-hez).
-
Sok a sokhoz (Many-to-Many)
belongsToMany(): Mindkét oldalon használható, közös köztes táblán keresztül. Például,Post-nak sokTag-je van, ésTag-nek sokPost-ja, apost_tagtáblán keresztül.
-
Egy az egyhez (polimorfikus) (One-to-One Polymorphic)
morphOne(): Olyan modellben használható, amelyhez különböző típusú kapcsolódó modellek tartozhatnak (pl.PostvagyUserrendelkezikImage-el).morphTo(): A polimorfikus kapcsolódó modellben használható (Image), hogy meghatározza, melyik modellhez tartozik (PostvagyUser).
-
Egy a sokhoz (polimorfikus) (One-to-Many Polymorphic)
morphMany(): Olyan modellben használható, amely több különböző típusú kapcsolódó modellt is tartalmazhat (pl.PostvagyCommenttöbbImage-t tartalmaz).morphTo(): A polimorfikus kapcsolódó modellben használható (Image), hogy meghatározza, melyik modellhez tartozik (PostvagyComment).
-
Sok a sokhoz (polimorfikus) (Many-to-Many Polymorphic)
morphToMany(): Mindkét oldalon használható, polimorfikus táblán keresztül. Például,PostvagyVideo-nak sokTag-je lehet, ataggablestáblán keresztül.morphedByMany(): A kapcsolódó modellben használható (Tag), hogy meghatározza, mely típusú modellekhez kapcsolódhat (PostvagyVideo).
Példa a hasMany és belongsTo módszerek megvalósítására:
<?php
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
/**
* A felhasználó posztjait szerzi meg.
*/
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
{
/**
* A felhasználót szerzi meg, amelyik a poszt tulajdonosa.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
A Laravel automatikusan feltételezi a külső kulcsok és a kapcsolódó táblák nevéit a modellek neve alapján. Ezeket a feltételezéseket felülírhatjuk további argumentumok átadásával a kapcsolati módszerekben. Például, a hasMany(Post::class, 'author_id') megadja, hogy a posts táblában a külső kulcs az author_id.