Relacionamentos com Laravel Eloquent

Laravel
Tempo de leitura: 4 minutos

Relacionamentos com Laravel Eloquent: Em qualquer aplicação orientada a dados, a forma como as informações se conectam é crucial. O Laravel Eloquent ORM fornece uma interface elegante e fluente para definir e gerenciar as associações entre seus models (tabelas), transformando consultas complexas em simples chamadas de método.

Compreender os relacionamentos do Eloquent é o alicerce para construir aplicações robustas e performáticas.

1. 🤝 Relacionamento Um para Um (HasOne / BelongsTo)

Um relacionamento “um para um” conecta um registro a exatamente um registro em outra tabela.

Exemplo: User e Profile

Um User tem um Profile. O Profile pertence a um User.

Model Principal (User)Model Relacionado (Profile)Chave Estrangeira
$user->profile()hasOne(Profile::class)profiles.user_id
$profile->user()belongsTo(User::class)profiles.user_id

PHP

// app/Models/User.php
class User extends Model
{
    // Um usuário tem um perfil
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

// app/Models/Profile.php
class Profile extends Model
{
    // Um perfil pertence a um usuário
    public function user()
    {
        // O Eloquent inferirá 'user_id'
        return $this->belongsTo(User::class); 
    }
}

// Utilização:
$user = User::find(1);
echo $user->profile->bio;

2. 📚 Relacionamento Um para Muitos (HasMany / BelongsTo)

O relacionamento “um para muitos” é o mais comum, onde um registro em uma tabela está associado a múltiplos registros em outra tabela.

Exemplo: Author e Post

Um Author tem muitos Posts. Cada Post pertence a um único Author.

Model Principal (Author)Model Relacionado (Post)Chave Estrangeira
$author->posts()hasMany(Post::class)posts.author_id
$post->author()belongsTo(Author::class)posts.author_id

PHP

// app/Models/Author.php
class Author extends Model
{
    // Um autor tem muitos posts
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

// app/Models/Post.php
class Post extends Model
{
    // Um post pertence a um autor
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

// Utilização:
$author = Author::find(1);
foreach ($author->posts as $post) {
    echo $post->title;
}

3. 🌐 Relacionamentos Através de Níveis

O Eloquent oferece atalhos para acessar dados relacionados através de modelos intermediários, evitando a necessidade de navegação manual.

A. Has One Through (Tem Um Através de)

Acessa um registro distante através de um registro intermediário.

Exemplo: Um Post tem um Country através do seu User.

PHP

// app/Models/Post.php
class Post extends Model
{
    public function country()
    {
        // Post -> User -> Country
        return $this->hasOneThrough(
            Country::class, // Model final que queremos
            User::class     // Model intermediário
        );
    }
}

// Utilização:
$post = Post::find(1);
echo $post->country->name; 

B. Has Many Through (Tem Muitos Através de)

Acessa múltiplos registros distantes através de um registro intermediário.

Exemplo: Um Country tem muitos Posts através dos seus Users.

PHP

// app/Models/Country.php
class Country extends Model
{
    public function posts()
    {
        // Country -> User -> Post (múltiplos)
        return $this->hasManyThrough(
            Post::class, // Model final (plural)
            User::class  // Model intermediário
        );
    }
}

// Utilização:
$country = Country::find(1);
$posts = $country->posts; 

C. Has One Of Many (Um de Muitos)

Recupera um único registro de um relacionamento Has Many com base em um critério (geralmente o mais novo ou mais antigo).

Exemplo: O Customer e a latestOrder.

PHP

// app/Models/Customer.php
class Customer extends Model
{
    public function latestOrder()
    {
        // Obtém o pedido mais recente com base no 'created_at'
        return $this->hasOne(Order::class)->latestOfMany(); 
    }
}

// Utilização:
$latestOrder = Customer::find(1)->latestOrder;

4. 🚀 Otimização: Eager Loading (Problema N+1)

O Problema N+1 ocorre quando você carrega um model (1 consulta) e, dentro de um loop, carrega os seus N relacionamentos (N consultas). O Eager Loading resolve isso, carregando os relacionamentos com o model principal em consultas separadas, porém otimizadas.

A. Eager Loading Básico (with)

Carrega todos os dados necessários em apenas 2 consultas.

PHP

// Consulta 1: SELECT * FROM posts
// Consulta 2: SELECT * FROM users WHERE id IN (IDs dos autores dos posts)
$posts = Post::with('author')->get(); 

foreach ($posts as $post) {
    // Acessa $post->author sem nova consulta
    echo $post->author->name; 
}

B. Eager Loading Aninhado e Condicional

PHP

// Carrega o usuário E o país do usuário em 3 consultas: Post -> User -> Country
$posts = Post::with(['user', 'user.country'])->get(); 

// Restringindo colunas e condições ao carregar
$posts = Post::with(['user' => function ($query) { 
    $query->select('id', 'name')->where('active', true); 
}])->get();

C. Contagem de Relacionamentos (withCount)

Conta os registros relacionados sem carregá-los, adicionando uma coluna relacionamento_count ao model principal.

PHP

// Adiciona a coluna 'posts_count' ao model Author
$authors = Author::withCount('posts')->get(); 

foreach ($authors as $author) {
    echo $author->name . " tem " . $author->posts_count . " posts.";
}

✅ Conclusão Relacionamentos com Laravel Eloquent

Relacionamentos com Laravel Eloquent: Os relacionamentos são a espinha dorsal de qualquer aplicação Laravel. Ao dominar os tipos (HasOne, HasMany, etc.), o gerenciamento de chaves estrangeiras, e a prática essencial do Eager Loading (with()), você garante que sua modelagem de dados seja não apenas legível e expressiva, mas também altamente performática e escalável.

Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:

HTML
HTML
CSS
CSS
Javascript
JavaScript
SQL
SQL
Capa Curso PHP
PHP

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime
Author: Thiago Rossi
Com mais de 20 anos de jornada na tecnologia, minha trajetória evoluiu do ensino técnico à arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de soluções de Inteligência Artificial nativa e análise de dados públicos, utilizando o ecossistema PHP para transformar dados brutos em transparência e eficiência. Como autor e desenvolvedor, acredito na democratização do conhecimento. Essa visão resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura até os bastidores da indústria de Jogos e IA. No universo de Game Design, sou autor do livro "GDD – O Guia Definitivo" e documento ativamente meus processos através de DevLogs, unindo rigor técnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso é conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.