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:
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:















