Site

Relacionamentos entre Models

v4

Relacionamentos conectam tabelas do banco. Métodos sempre em snake_casee classes em lowercase: customer::class, não Customer::class.


Tipos disponíveis

has_one()
has_many()
belongs_to()
belongs_to_many()
$customer = customer::find(1);

$customer->billing_profile;
$customer->order_items;
$post->tags;

has_one — um para um

public function billing_profile()
{
    return $this->has_one(billing_profile::class, 'customer_id', 'id');
}

// Uso:
$customer->billing_profile;

has_many — um para muitos

public function order_items()
{
    return $this->has_many(order_item::class, 'customer_id', 'id');
}

// Uso:
$customer->order_items;

Retorna uma collection com métodos como filter(), pluck(), sum(). Veja Collections.


belongs_to — pertence a

public function customer()
{
    return $this->belongs_to(customer::class, 'customer_id', 'id');
}

// Uso:
$order->customer;

belongs_to_many — muitos para muitos

public function tags()
{
    return $this->belongs_to_many(
        tag::class,
        'post_tag',
        'post_id',
        'tag_id'
    );
}

// Uso:
$post->tags;
$post->tags()->attach(1);
$post->tags()->sync([1, 2]);

Operações na pivô em Operações de Relação.


Parâmetros

has_many(model::class, foreign_key, local_key)
has_one(model::class, foreign_key, local_key)
belongs_to(model::class, foreign_key, owner_key)
belongs_to_many(model::class, pivot_table, foreign_key, related_key)

Eager loading

Carregue relações antes de usar na view para evitar consultas extras:

$customers = customer::with(['order_items', 'billing_profile'])->get();

Boas práticas

  • Métodos de relação em snake_case: billing_profile(), order_items()
  • Classes em lowercase: order_item::class
  • Use with() em listagens
  • Nomes no singular para has_one/belongs_to, plural para has_many