Sobes.tech
Middle

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:

  1. Um para um (One-to-One)

    • hasOne(): Usado no modelo que "possui" a relação (por exemplo, User tem Phone).
    • belongsTo(): Usado no modelo que "pertence" a outro modelo (por exemplo, Phone pertence a User).
  2. Um para muitos (One-to-Many)

    • hasMany(): Usado no modelo que pode ter múltiplos modelos relacionados (por exemplo, User tem muitos Post).
    • belongsTo(): Usado no modelo que pertence a múltiplos modelos relacionados (um para muitos na direção oposta, por exemplo, Post pertence a User).
  3. Muitos para muitos (Many-to-Many)

    • belongsToMany(): Usado em ambos os lados da relação através de uma tabela de pivô (por exemplo, Post tem muitos Tag, e Tag tem muitos Post, relacionados através da tabela post_tag).
  4. Um para um (polimórfico) (One-to-One Polymorphic)

    • morphOne(): Usado no modelo que pode pertencer a diferentes tipos de modelos relacionados (por exemplo, Post ou User têm Image).
    • morphTo(): Usado no modelo relacionado polimórfico (Image) para determinar a qual modelo pertence (Post ou User).
  5. Um para muitos (polimórfico) (One-to-Many Polymorphic)

    • morphMany(): Usado no modelo que pode ter muitos modelos relacionados de diferentes tipos (por exemplo, Post ou Comment têm muitas Image).
    • morphTo(): Usado no modelo relacionado polimórfico (Image) para determinar a qual modelo pertence (Post ou Comment).
  6. 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, Post ou Video podem ter muitos Tag, relacionados através da tabela taggables).
    • morphedByMany(): Usado no modelo relacionado (Tag) para determinar a quais tipos de modelos pode estar ligado (Post ou Video).

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.