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:
-
Jeden ku jednému (One-to-One)
hasOne(): Používa sa v modeli, ktorý "vlastní" vzťah (napríklad,UsermáPhone).belongsTo(): Používa sa v modeli, ktorý "patrí" inému modelu (napríklad,PhonepatríUser).
-
Jeden ku mnohým (One-to-Many)
hasMany(): Používa sa v modeli, ktorý môže mať mnoho súvisiacich modelov (napríklad,Usermá veľaPost).belongsTo(): Používa sa v modeli, ktorý patrí mnohým súvisiacim modelom (napríklad,PostpatríUser).
-
Mnoho ku mnohým (Many-to-Many)
belongsToMany(): Používa sa na oboch stranách vzťahu cez spojovaciu tabuľku. Napríklad,Postmá veľaTag, aTagmá veľaPost, cez tabuľkupost_tag.
-
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,PostaleboUsermajúImage).morphTo(): Používa sa v polymorfnom súvisiacom modeli (Image), aby určil, ku ktorému modelu patrí (PostaleboUser).
-
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,PostaleboCommentmajú veľaImage).morphTo(): Používa sa v polymorfnom súvisiacom modeli (Image), aby určil, ku ktorému modelu patrí (PostaleboComment).
-
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,PostaleboVideomôžu mať veľaTag, cez tabuľkutaggables.morphedByMany(): Používa sa v súvisiacom modeli (Tag), aby určil, ku ktorým typom modelov môže byť pripojený (PostaleboVideo).
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.