Sobes.tech
Middle

Ako sa implementujú typy vzťahov v Laravel?

sobes.tech AI

Odpoveď od AI

V Laravelu sa vztahmi (odnosi) medzi modelmi sa zaoberáme pomocou metód definovaných v príslušných modeloch. Tieto metódy vracajú objekty špeciálnych tried, ktoré opisujú typ vzťahu.

Hlavné typy vzťahov a ich metódy:

  1. Jeden ku jednému (One-to-One)

    • hasOne(): Používa sa v modeli, ktorý "vlastní" vzťah (napríklad, UserPhone).
    • belongsTo(): Používa sa v modeli, ktorý "patrí" inému modelu (napríklad, Phone patrí User).
  2. Jeden ku mnohým (One-to-Many)

    • hasMany(): Používa sa v modeli, ktorý môže mať mnoho súvisiacich modelov (napríklad, User má veľa Post).
    • belongsTo(): Používa sa v modeli, ktorý patrí mnohým súvisiacim modelom (napríklad, Post patrí User).
  3. Mnoho ku mnohým (Many-to-Many)

    • belongsToMany(): Používa sa na oboch stranách vzťahu cez spojovaciu tabuľku. Napríklad, Post má veľa Tag, a Tag má veľa Post, cez tabuľku post_tag.
  4. Jeden ku jednému (polymorfný) (One-to-One Polymorphic)

    • morphOne(): Používa sa v modeli, ktorému môžu patriť rôzne typy súvisiacich modelov (napríklad, Post alebo User majú Image).
    • morphTo(): Používa sa v polymorfnom súvisiacom modeli (Image), aby určil, ku ktorému modelu patrí (Post alebo User).
  5. Jeden ku mnohým (polymorfný) (One-to-Many Polymorphic)

    • morphMany(): Používa sa v modeli, ktorý môže mať veľa súvisiacich modelov rôzneho typu (napríklad, Post alebo Comment majú veľa Image).
    • morphTo(): Používa sa v polymorfnom súvisiacom modeli (Image), aby určil, ku ktorému modelu patrí (Post alebo Comment).
  6. Mnoho ku mnohým (polymorfný) (Many-to-Many Polymorphic)

    • morphToMany(): Používa sa na oboch stranách vzťahu cez polymorfnú spojovaciu tabuľku. Napríklad, Post alebo Video môžu mať veľa Tag, cez tabuľku taggables.
    • morphedByMany(): Používa sa v súvisiacom modeli (Tag), aby určil, ku ktorým typom modelov môže byť pripojený (Post alebo Video).

Príklad implementácie hasMany a belongsTo:

<?php

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

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

class User extends Model
{
    /**
     * Získať príspevky používateľa.
     */
    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
{
    /**
     * Získať používateľa, ktorý vlastní príspevok.
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

Laravel automaticky predpokladá názvy cudzích kľúčov a názvy súvisiacich tabuliek na základe názvov modelov. Tieto predpoklady je možné prepísať poskytnutím ďalších argumentov do metód vzťahov. Napríklad, hasMany(Post::class, 'author_id') označuje, že cudzí kľúč v tabuľke posts sa volá author_id.