Como são implementados os tipos de ligação no Laravel?
sobes.tech IA
Resposta da IA
Em Laravel, os tipos de relações entre modelos são implementados através de métodos definidos nos modelos correspondentes. Estes métodos retornam objetos de classes especiais que descrevem o tipo de relação.
Os principais tipos de relações e os seus métodos:
-
Um para um (One-to-One)
hasOne(): Usado no modelo que "possui" a relação (por exemplo,UsertemPhone).belongsTo(): Usado no modelo que "pertence" a outro modelo (por exemplo,Phonepertence aUser).
-
Um para muitos (One-to-Many)
hasMany(): Usado no modelo que pode ter múltiplos modelos relacionados (por exemplo,Usertem muitosPost).belongsTo(): Usado no modelo que pertence a múltiplos modelos relacionados (um para muitos na direção oposta, por exemplo,Postpertence aUser).
-
Muitos para muitos (Many-to-Many)
belongsToMany(): Usado em ambos os lados da relação através de uma tabela de pivô (por exemplo,Posttem muitosTag, eTagtem muitosPost, relacionados através da tabelapost_tag).
-
Um para um (polimórfico) (One-to-One Polymorphic)
morphOne(): Usado no modelo que pode pertencer a diferentes tipos de modelos relacionados (por exemplo,PostouUsertêmImage).morphTo(): Usado no modelo relacionado polimórfico (Image) para determinar a qual modelo pertence (PostouUser).
-
Um para muitos (polimórfico) (One-to-Many Polymorphic)
morphMany(): Usado no modelo que pode ter muitos modelos relacionados de diferentes tipos (por exemplo,PostouCommenttêm muitasImage).morphTo(): Usado no modelo relacionado polimórfico (Image) para determinar a qual modelo pertence (PostouComment).
-
Muitos para muitos (polimórfico) (Many-to-Many Polymorphic)
morphToMany(): Usado em ambos os lados da relação através de uma tabela de pivô polimórfica (por exemplo,PostouVideopodem ter muitosTag, relacionados através da tabelataggables).morphedByMany(): Usado no modelo relacionado (Tag) para determinar a quais tipos de modelos pode estar ligado (PostouVideo).
Exemplo de implementação de hasMany e belongsTo:
<?php
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
/**
* Obter as publicações do utilizador.
*/
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
{
/**
* Obter o utilizador que possui a publicação.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
O Laravel assume automaticamente os nomes das chaves externas e nomes das tabelas relacionadas com base nos nomes dos modelos. Estas suposições podem ser sobrescritas passando argumentos adicionais aos métodos de relação. Por exemplo, hasMany(Post::class, 'author_id') indica que a chave externa na tabela posts se chama author_id.