Relacionando Models e Tabelas no Laravel 5.4

Victor Hugo Rocha
Training Center
Published in
3 min readJun 15, 2017

Olá, DevZ.

victorhugorocha.tk

Os bancos de dados relacionais foram criados para prover um acesso facilitado aos dados, veremos no artigo de hoje como conseguir criar essa relação e acessar esses dados. Como já tocamos no tema de migrations irei passar rápido pelo tema, você pode ler mais sobre o assunto nesse artigo. Vamos rodar o comando para criarmos a Model e a Migration.

php artisan make:model Fornecedor -m
php artisan make:migration create_fornecedores_table

Esse é um exemplo de uma migration. Na função up criamos a tabela e na função down dropamos a tabela caso ela exista, também há um método de drop, mas DropIfExists é com certeza a melhor prática possível. Existe uma lista grande de tipos de colunas que podem ser usados além desses a cima, você pode ver os tipos disponíveis na documentação.

Model de Fornecedores

Essa é a Model gerada pelo comando anterior, cabe algumas observações sobre ela. A variável table indica ao Laravel qual a tabela no banco referente aquela model. Por padrão ele identifica a tabela sendo o plural do nome da Model, como estou escrevendo os nomes em português nem sempre adicionar um ‘s’ é o plural correto do nome do Modelo.

Explicando um pouco mais, caso não estivesse explícito pela variável table, o Laravel buscaria a tabela “fornecedors”, como ela não existe seria lançado um erro ao utilizar o sistema. A variável $fillable indica o que pode ser inserido no banco pelo usuário, por padrão o Laravel protege todos os campos de Mass Assignment. Você pode ler mais sobre isso na documentação.

O Eloquent por padrão espera os campos created_at e updated_at na sua tabela, como nesse sistema essas informações não eram necessárias para essa tabela a variável $timestamp precisa ser adicionada como false.

E agora sim vamos falar o relacionamento entre as Models. Nesse artigo vamos criar uma relação Fornecedor x Produto onde Fornecedores HasMany Produtos e Produtos belongsToMany Fornecedores. Explicando mais, no nosso sistema um Fornecedor tem muitos Produtos e um Produto pode pertencer a muitos Fornecedores.

Essas não são as únicas relações possíveis, também podemos fazer relações: hasOne, belongsTo, morphTo, morphMany, entre outras. Você pode ler mais sobre essas relações na documentação. Nesse artigo vamos focar no nosso exemplo de relação.

Na model acima nós criamos uma função produtos() dentro da Model Fornecedor. Fazemos isso pois essa função torna acessível os produtos que estão relacionados a um determinado fornecedor. Faremos parecido na Model Produto.

php artisan make:model Produto -m

Essa é a nossa Model de Produto. Perceba que ela só possui a variável $fillable, informando os dados que podem ser inseridos pelo usuário no banco. Pois para mim era interessante saber quando um produto havia sido criado ou atualizado (created_at e updated_at) e como o Plural de Produto já é o nome dado a nossa migration podemos omitir a variável $table.

Criamos uma função fornecedores() onde fazemos a relação BelongsToMany e passamos a model Fornecedor como parâmetro da função. Outro parâmetro possível a relação seria quais são as chaves estrangeiras responsáveis por essa relação mas como vamos seguir o padrão buscado pelo Eloquent podemos omitir esse parâmetro e passarmos apenas o modelo.

php artisan make:migration create_fornecedor_produto_table

Agora vamos falar sobre o relacionamento entre tabelas. A convenção do Laravel é sempre colocar o nome das tabelas no singular e em ordem alfabética. Não é obrigatório, mas facilita a implementação dos Models. Na tabela relacionamento temos uma chave estrangeira para a tabela produtos e fornecedores.

O conceito de chave estrangeira ou chave externa se refere ao tipo de relacionamento entre distintas tabelas de dados do banco de dados. Uma chave estrangeira é chamada quando há o relacionamento entre duas tabelas.

Como usamos o padrão “modelo_id” para o nome das nossas FK (foreign key/chave estrangeira) não precisamos passa-los como parâmetro na função que faz o relacionamento na Model, aconselho a sempre seguir esse padrão.

Se você chegou até aqui não esqueça de deixar o seu ❤ e/ou um comentário. I ❤ seu Feedback. Se você tem interesse por Laravel ou gostou do meu texto você pode ler algum dos meus outros artigos, recomendo:

  1. PHP — Implementando adminLTE no Laravel 5.4
  2. PHP — Criando um CRUD com Laravel 5.4
  3. Docker — Dockerhub, pull e push nas suas imagens
  4. Telegram Bot — Como fazer um Bot com Javascript e Heroku

See you, Space Cowboy!

--

--