Explorando o Eloquent: Relacionamentos

Henrique França
sysvale
Published in
4 min readJun 2, 2023

Introdução

Para começarmos a falar sobre o eloquent vamos precisar de uma breve definição. Bem de forma simples, eloquent é um Object-Relational-Mapper (ORM) que vêm integrado ao Laravel. Por que ele é importante ? O eloquent busca facilitar a interação do Laravel com uma base de dados, permitindo estabelecer relacionamentos entre as tabelas e executar diversas operações como update, insert, delete.

Relacionamentos

Antes de começarmos vamos tornar o conceito de relacionamento mais claro. O que são relacionamentos? Os relacionamentos no banco de dados são associações estabelecidas entre tabelas. Como exemplo, no banco de dados existe uma tabela de Clientes e uma de Endereços onde é estabelecido que um cliente está associado a um endereço, para vincular as informações do cliente e endereço é criado um relacionamento entre essas tabelas.

No Laravel o Eloquent cria seus relacionamentos através de métodos, a construção de relacionamentos auxiliam a realização de query’s na base de dados.

Os tipos de relacionamentos explorados nesse artigo serão:

  • Um para um (One to One)
  • Um para Muitos (One to Many)
  • Muitos para muitos (Many to Many)

Um pra um

O relacionamento “um pra um” e a forma mais básica de relacionamento, onde define a relação que um item possui um outro item. Para exemplificar utilizaremos o exemplo anterior, onde temos uma tabela de clientes e endereços, em que cada cliente vai estar associado a um endereço. E como seria isso no Laravel com Eloquent?

Primeiramente criamos suas respectivas tabelas, vamos optar por executar o comando de criação de model com a opção -m, pois assim será criado uma migração para o model em questão.

php artisan make:model Client -m
php artisan make:model Address -m

Adicionamos a chave externa da tabela de Cliente (Foreign Key) na tabela de migração Endereço e executamos a migração.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Address extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('address', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();

$table->foreignId('client_id');
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::drop('address');
}
};

Após, devemos criar o relacionamento na tabela de Cliente, criando o método e utilizando o hasOne para indicar que a tabela de cliente possui um endereço.

public function address(): HasOne
{
return $this->hasOne(Address::class);
}

Devemos então adicionar a logica reversa do relacionamento na tabela de endereços. Para isso criamos o método e utilizamos o belongsTo para indicar que o endereço pertence a um cliente.

public function client(): BelongsTo
{
return $this->belongsTo(Client::class);
}

Um para muitos

Outro relacionamento importante a ser explorado é o “um para muitos”, onde define a relação que um item possui muitos outros itens. Seguindo o exemplo que estabelecemos, podemos definir que um cliente possa realizar vários pedidos. A aplicação e similar ao relacionamento “um para um”.

Primeiramente, devemos criar a tabela de Pedidos.

php artisan make:model Order -m

Adicionamos a tabela de Cliente o método que define a relação de pedidos utilizando o hasMany, para indicar que um cliente possui vários pedidos.

public function orders(): HasMany
{
return $this->hasMany(Order::class);
}

Aplicando a logica inversa do relacionamento a tabela de Pedidos. Para isso criamos o método e utilizamos o belongsTo para indicar que o pedido pertence a um cliente.

public function client(): BelongsTo
{
return $this->belongsTo(Client::class);
}

Muitos para muitos

A relação “muitos para muitos” possui uma complexidade maior. O relacionamento define que um item pode ser relacionado a vários outros itens e vice-versa. Assim, voltando para o nosso exemplo, se temos pedidos e produtos, um pedido pode possuir vários produtos, entretanto um produto pode estar associado a vários outros pedidos.

E como lidaremos com as chaves externa nesse relacionamento? para esse relacionamento é necessário uma tabela intermediária, chamada de tabela pivô, que irá armazenar a chave externa da tabela de pedido e produto, com isso conseguimos relacionar cada pedido a um produto.

E como seria no Laravel? Primeiro criamos a migração da tabela pivô.

php artisan make:migration create_order_product_table --create=order_product

A seguir adicionamos as chaves externas das tabelas pedido e produto na migração da tabela pivô dentro do método up.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateOrderProductTable extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('order_product', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();

$table->foreignId('order_id');
$table->foreignId('product_id');
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::drop('order_product');
}
};

Seguimos criando a tabela de produtos e adicionamos o relacionamento na tabela de produtos utilizando o belongsToMany.

php artisan make:model Product -m
public function orders(): BelongsToMany
{
return $this->belongsToMany(Order::class);
}

E por fim, adicionando o relacionamento na tabela de pedidos com o belongsToMany.

public function products(): BelongsToMany
{
return $this->belongsToMany(Product::class);
}

Conclusão

Bem chegamos ao final desse artigo, nesse artigo procurei definir o Eloquent e os conceitos básicos de relacionamentos e como ele trabalha. Os relacionamentos explorados nesse artigo são os mais comuns e utilizados em conceitos básicos. Alguns exemplos comentam sobre migrações (migrations), o que não foi explorado nesse artigo, em caso de duvidas consulte: https://laravel.com/docs/10.x/migrations.

Espero que este artigo tenha lhe sido útil, torço para que continue buscando conhecimento no Laravel e se aprofundando no Eloquent.

Boa sorte na sua Jornada!

--

--