Eloquent, simplificando as Models no Laravel

Continuando a série sobre o Laravel, hoje trago o “Eloquent” uma forma quase mágica e simples de trabalhar com consultas a bancos de dados. Também trarei exemplos de sua aplicação em Models.

Hoje retomo a série de Artigos sobre o Laravel trazendo o Eloquent, uma forma simples de trabalhar com consultas a bancos de dados e desenvolver suas Models.

No último artigo, abordei a criação das migrations e, como o Laravel pode relacionar as tabelas para você. Lembra do exemplo da tabela de produtos que eu criei? Então… Agora é hora de começar a buscar estes dados para a nossa aplicação. Para isto precisaremos criar Eloquent Models.

Models

As Models, dentro da arquitetura MVC, são classes responsáveis pela leitura, escrita e validação  de qualquer dado. Por isto, será aqui que iremos trabalhar com Eloquent para fazermos todo tipo de ações no nosso banco de dados. Mas, primeiro vamos entender o que é o Eloquent.

Eloquent no Laravel

O Eloquent nada mais é que um ORM que vem em conjunto com o Laravel. Mas, melhor que isso, ele possui uma estrutura bem simples para você realizar a implementação da sua lógica de controle com banco de dados.

Com base nos preceitos do ORM (Object relational mapping) Eloquent abstrai toda a complexidade da interação com os bancos de dados utilizando as Models para interagir com cada tabela.

Para facilitar o trabalho com ele existem algumas convenções como:

  • Os nomes de tabelas são padronizadas para o plural da classe que irá consumí-la.
  • As Primary keys são sempre vinculadas à uma coluna id.
  • Toda tabela possuirá colunas timestamp mostrando a data de criação (created_at) e data de atualização (updated_at).
  • Por padrão, as Models do Eloquent irão buscar as configurações de conexão com o banco de dados no arquivo padrão do Laravel, “config/database.php”.

Resumidamente falando, ele consegue trazer em uma ou duas linhas o que você gastaria muitas linhas de comando para executar.

Criando as Models com Eloquent

Saindo um pouco da teoria, vamos voltar ao nosso exemplo. Precisamos criar as Models que irão trabalhar com as tabelas “product_lines” e “products”. Para isto vou abrir o terminal da minha Hospedagem Cloud que possuo aqui na DialHost e digitar o seguinte comando:

[code]php artisan make:model product_line
php artisan make:model product
[/code]

Ao executar estes comandos vamos poder observar que as novas classes foi criada dentro da pasta app.

product_line.php

[php]<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product_line extends Model
{
//
}
[/php]

product.php

[php]<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
//
}
[/php]

Para um sistema de consultas básico nem é necessário implementar funções dentro destas classes. Isto porque o próprio “Eloquent Model” já implementa diversas funções de consultas e manipulação de dados com o banco. Com a classe referenciada vou apenas chamar as funções do Eloquent diretamente através da Controller.

Principais Funções do Eloquent

Consultas

[php]<?php

Product::all();
// Retorna todos os registros da tabela Products (Seria o equivalente a
// SELECT * FROM products, para o MySQL)

Product::find($id);
// Retorna todos os dados do registro da tabela Products com o $id
// especificado na busca

Product::where(‘product_line_id’,1)->get();
// Executa uma query com parâmetros de restrição (WHERE)

Product::where(‘product_line_id’,1)
->orderBy(‘product_line_id’,’description’)
->take(10)
->get();
// Executa uma query com parâmetros de restrição (WHERE e LIMIT)
// organizando pelas colunas especificadas

[/php]

Para estas duas últimas funções, aconselho que sejam criadas funções dentro da Model que as executem. Assim, podemos abstrair a regra de consulta das Controllers. Esta forma é uma boa prática , principalmente se temos uma query complexa que exija muitos wheres e etc.

Você ainda pode utilizar de funções agregadoras como count, sum, avg, max, min.

[php]<?php

Product::where(‘product_line_id’, 1)->count();
// Executa uma query que conta o número de registro dentro dos
// parâmetros de restrição (WHERE)

Product::where(‘product_line_id’, 1)->sum(‘price’);
// Executa uma query retornando a soma de todos os preços do resultado da busca

Product::where(‘product_line_id’, 1)->avg(‘price’);
// Executa uma query que retorna a média de preços do resultado da busca

Product::where(‘product_line_id’, 1)->max(‘price’);
// Executa uma query que retorna o maior preço encontrado na busca

Product::where(‘product_line_id’, 1)->count();
// Executa uma query que retorna o menor preço encontrado na busca
// parâmetros de restrição (WHERE)

[/php]

Inserindo dados com Eloquent

Para inserir dados com o Eloquent existem 2 formas. Na primeira, você instancia a Model em uma variável, dentro da Controller, seta os atributos e então salva tudo no final.

[php]<?php

$product= new Product;

$product->product_line_id = $request->product_line_id ;
$product->description = $request->description;
$product->expiration_time= $request->expiration_time;
$product->price = $request->price;

$product->save();

[/php]

Eu particularmente achei mais direta e limpa a forma a seguir. Ela é denomiada como Mass Assignment. Aqui eu chamo uma função estática que cria o registro passando os atributos como array

[php]<?php

$data = [
‘product_line_id’ => request(‘product_line_id’),
‘description’ => request(‘description’),
‘expiration_time’ => request(‘expiration_time’),
‘price’ => request(‘price’)
];

Product::create($data);

[/php]

Para fazer a inserção desta segunda forma você precisa setar na sua Model os campos que serão permitidos serem setados. Por se tratar de uma inserção em massa o Laravel bloqueia todos os campos por padrão. Isto é para evitar que usuários consigam passar parâmetros indesejados na Request e que eles acabem alterando um dado importante dentro do banco de dados.

Então criarei na Model Product a variavel “fillable” e definirei um array com os campos que serão inseridos aqui.

[php]class Product extends Model{

protected $fillable = [
‘description’,
‘expiration_time’,
‘price’,
‘product_line_id’
];

[/php]

Atualizando dados com Eloquent

A forma mais convencional de atualizar um dado através do Eloquent é semelhante a inserir um dado. A diferença é que já teremos a instância do produto especifico que iremos editar e então salvar o novo valor.

[php]<?php

public function update(Product $product, Request $request){

$product->product_line_id = $request->product_line_id;
$product->description = $request->description;
$product->expiration_time = $request->expiration_time;
$product->price = $request->price;
$product->save();

[/php]

Removendo dados com Eloquent

Remover um dado com Eloquent é ainda mais fácil basta setarmos na função o comando delete() na instância que estamos trabalhando.

[php]<?php

public function delete(Product $product){
$product->delete();

[/php]

Conclusão

É claro que na vida real ainda teremos que fazer validações para deletar o registro apenas se ele realmente existir no banco. Ou durante uma edição verificar se o dado já existe antes de atualizá-lo e senão perguntar se o usuário deseja criar.

Apenas lendo por alto o Eloquent já  pensei em um novo post com algumas funções que não deu para explanar aqui. Se fosse a fundo nestas funções este artigo ficaria muito extenso e cansativo. então aguardem até o próximo post onde eu irei falar um pouco sobre funções específicas de busca, updates, criação e remoção de dados.

Compartilhe este artigo:

Share on facebook
Facebook
Share on whatsapp
WhatsApp
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on email
E-mail
Share on print
Imprimir

0 resposta em “Eloquent, simplificando as Models no Laravel”

Sobre o autor:

Outros artigos:

Novidades do Blog

Deixe seu e-mail abaixo para passar a receber promoções e novidades do nosso Blog.