Sobes.tech
Middle

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:

  1. Egy az egyhez (One-to-One)

    • hasOne(): A modellt használja, amely "birtokol" egy kapcsolatot (pl. User rendelkezik Phone-nal).
    • belongsTo(): A modellt használja, amely "tartozik" egy másik modellhez (pl. Phone tartozik User-hez).
  2. Egy a sokhoz (One-to-Many)

    • hasMany(): A modellt használja, amely több kapcsolódó modellt is tartalmazhat (pl. User-nak sok Post-ja van).
    • belongsTo(): A modellt használja, amely tartozik sok kapcsolódó modellhez (pl. Post tartozik User-hez).
  3. 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 sok Tag-je van, és Tag-nek sok Post-ja, a post_tag táblán keresztül.
  4. 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. Post vagy User rendelkezik Image-el).
    • morphTo(): A polimorfikus kapcsolódó modellben használható (Image), hogy meghatározza, melyik modellhez tartozik (Post vagy User).
  5. 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. Post vagy Comment több Image-t tartalmaz).
    • morphTo(): A polimorfikus kapcsolódó modellben használható (Image), hogy meghatározza, melyik modellhez tartozik (Post vagy Comment).
  6. Sok a sokhoz (polimorfikus) (Many-to-Many Polymorphic)

    • morphToMany(): Mindkét oldalon használható, polimorfikus táblán keresztül. Például, Post vagy Video-nak sok Tag-je lehet, a taggables táblán keresztül.
    • morphedByMany(): A kapcsolódó modellben használható (Tag), hogy meghatározza, mely típusú modellekhez kapcsolódhat (Post vagy Video).

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.