O Eloquent no Laravel permite muito mais do que apenas simplificar o trabalho em bancos de dados com as suas models. Aprenda um pouco mais sobre novas funções que também conseguimos desenvolver com o Eloquent
Tópicos
1 – findOrFail
A função findOrFail trata exceções nas buscas do banco de dados. Utilizando como exemplo o que fizemos em outro artigo deste blog, ao fazermos uma busca pelo id do produto utilizando o findOFail($id), ele retornava uma coleção com os resultados da busca ou dispararia um erro 404 se nenhum resultado fosse encontrado.
Ele é um método bem útil para tratarmos os resultados de Rotas ou Controllers que necessitam do resultado desta busca para funcionar.
[php]public function show($id){
Product::findOrFail($id);
}
[/php]
2 – firstOrFail
Este método do Eloquent no Laravel é semelhante ao anterior. Porém, ele limitará a busca apenas ao primeiro resultado obtido. Ele é útil para fazer uma busca mais ampla e mesmo assim trazer apenas um resultado.
[php]public function show($id){
Product::where(‘price’,’>’,3.5)->firstOrFail();
}
[/php]
3 – Otimizando o uso de memória com Chunk
Ao fazer buscas podemos nos deparar com resultados gigantescos dependendo da tabela que consultamos. Estas consultas podem demorar para trazer um retorno e consumir muita memória.
Para resolver este problema o Eloquent possui a função chunk. É ela que faz a quebra desta consulta em pedaços menores. Assim, o PHP processará centenas de milhares de registros sem estourar o seu uso de memória.
[php]Product::chunk(200, function ($products) {
foreach ($products as $product) {
// Faça o qualquer coisa que você queira com este dado.
}
});
[/php]
No exemplo acima, temos dois parâmetros sendo passados. O primeiro é o limite de resultados que cada bloco irá trabalhar. O segundo é o que será executado para cada resultado de cada bloco da consulta.
Podemos dizer que ele otimiza a consulta colocando um limite de resultados e fazendo um foreach automático até que todos os resultados da consulta sejam processados.
4 – Otimizando o uso de memória com Cursor
Ainda para otimização de buscas temos o método cursor. Ele tem uma aplicação semelhante. Neste caso, porém, ele trabalhará com apenas uma query. A otimização aqui fica por conta do retorno que a função cursor tem. Ela retornará um Generator.
Um generator permite que escrevamos um código que utiliza foreach para interagir com um conjunto de informações sem precisar de registrar um array na memória. Assim, diminui-se o risco risco de estourarmos a memória em um processamento grande de dados.
Para usar esta função fazemos como abaixo:
[php]foreach (Product::where(‘price’,3.5)->cursor() as $product) {
// Faça o qualquer coisa que você queira com este dado.
}
[/php]
5 – Mass Update com Eloquent no Laravel
No exemplo do outro artigo deste blog, mostramos como fazer um update de um registro em específico. Mas, podemos atualizar diversos registros que contemplam uma condição passada.
Para isso usamos o comando update. Com esta função o Eloquent atualizará o campo passado em todos os resultados da busca que você fizer antes.
[php]Product::where(‘product_line_id’, 1)
->update([‘product_line_id’ => 2]);
[/php]
6 – firstOrCreate
O firstOrCreate fará a criação de um registro, mas primeiro ele validará se o registro já existe no banco. Se o registro já existir teremos apenas o retorno do mesmo. Senão, ele criará o registro.
Como fica claro, este comando só será útil para criar dados únicos. No nosso exemplo do outro artigo isto seria interessante para o product line, já que não queremos que exista mais de uma linha de produtos com o mesmo nome.
[php] $productLine = Product_line::firstOrCreate([‘description’ => ‘salgados’]);
[/php]
7 – firstOrNew
Assim como o firstOrCreate o firstOrNew do Eloquent, este comando tentará encontrar um registro já existente do parâmetro que passarmos. A diferença é que ele não salvará o registro no banco de dados, mas sim, instanciará um novo model com este registro.
Assim, para salvar realmente no banco será necessário executar o comando “save”.
[php] $productLine = Product_line::firstOrCreate([‘description’ => ‘salgados’]);
[/php]
8 – updateOrCreate
Mais uma vez, a função updateOrCreate buscará um registro existente do parâmetro que passamos. Mas, como diz o nome da função aqui ele vai atualizará o valor ou criar o novo registro no banco de dados.
Esta função se torna útil para uma edição forçada onde mesmo que o registro exista, você queira atualizar um parâmetro vinculado a ele.
[php] $units= Units::updateOrCreate([‘description’ => ‘kilogramas’],[‘abbreviation’ =>’kg’]);
[/php]
O primeiro parâmetro será o campo que faremos a busca. Caso a consulta retorne um valor, o sistema atualizará o campo abbreviation. Caso não encontre, o mesmo criará um registro novo com a description “Kilogramas” e setará a abbreviation como “Kg”.
9 – SoftDelete com Eloquent no Laravel
No Soft Delete seus dados não serão deletados realmente, eles apenas terão setados um campo deleted_at sempre que for executada uma ação de delete().
Para isto funcionar, primeiramente temos que setar em nossa migration schema o campo softDeletes.
Lembra do código abaixo? (Tudo bem se não lembrar, basta conferir o post Criando migrations com o Laravel 5.5)
Adicionamos ao final o campo softDeletes.
[php]class create_product extends Migration
{
public function up() {
Schema::create(‘product’, function (Blueprint $table) {
$table->smallIncrements(‘id’);
$table->string(‘description’)->unique();
$table->string(‘expiration_date’);
$table->decimal(‘price’, 5, 2);
$table->timestamps();
$table->softDeletes(); //ADICIONEI AQUI O SOFTDELETE
$table->engine = ‘InnoDB’;
});
}
[/php]
Agora precisamos setar nossa model para trabalhar com softDelete. Para isto chamaremos a classe SoftDeletes para usarmos, e criaremos uma variável $dates
[php] use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model {
use SoftDeletes;
protected $fillable = [‘description’,’expiration_time’,’price’,’product_line_id’];
protected $dates = [‘deleted_at’];
public function product_line(){
return $this->belongsTo(Product_line::Class);
}
}
[/php]
Com tudo isto configurado, agora toda vez que você executar a função delete() do Eloquent ela definirá a coluna deleted_at com a data e hora do momento da exclusão.
Por fim, ficou bem fácil caso queira restaurar este dado. Basta executar a função restore() do Eloquent como abaixo.
[php]$product = Product::onlyTrashed()
->where(‘product_id’, 1)
->get();
$product->restore();
[/php]
Conclusão
O Eloquent tem diversas funções para facilitar e diminuir o seu trabalho com aquelas tarefas usuais em banco de dados. Mas se você quiser aprender mais, basta clicar no link a seguir para conferir onde já falamos sobre o Eloquent no Laravel e como ele pode simplificar o trabalho das models com os bancos de dados.