Aprofundando nas funções do Eloquent do Laravel

Desenvolvimento

Aprofundando no Eloquent do Laravel
Aprofundando no Eloquent do Laravel

No artigo anterior, eu falei sobre o Eloquent e como ele pode simplificar o trabalho das models com os bancos de dados. Para este artigo deixei algumas funções que achei realmente diferenciadas para aprofundar neste segundo artigo. Então vamos lá!

findOrFail no Eloquent

A função findOrFail trata exceções nas buscas do banco de dados. No exemplo do artigo passado ao fazermos uma busca pelo id do produto, utilizando o findOFail($id), ele retornaria 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.

firstOrFail

Este método do Eloquent é semelhante ao findOrFail. Porém, ele limitará a busca apenas ao primeiro resultado obtido.

Este método firstOrFail é útil para fazer uma busca mais ampla e mesmo assim trazer apenas um resultado.

Otimizando o uso de memória com Chunk e Cursor do Eloquent

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

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.

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.

No caso para usar esta função fazemos como abaixo:

Mass Update com Eloquent

No último artigo eu mostrei como fazer um update de um registro em específico. Mas, podemos atualizar diversos registros que contemplam uma condição passada. Para isso usamo o comando update do Eloquent. Com esta função o Eloquent atualizará o campo passado em todos os resultados da busca que você fizer antes.

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 realizar a criação de dados únicos. No nosso exemplo isto seria interessante para o product line, já que não quero que existam mais de um linha de produtos com o mesmo nome.

firstOrNew

Assim como o firstOrCreate o firstOrNew do Eloquent 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”.

updateOrCreate

Mais uma vez, a função updateOrCreate irá 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 eu queira atualizar um parâmetro vinculado a ele.

Aqui, o primeiro parâmetro será o campo que iremos fazer a busca. Caso a consulta retorne um valor o sistema irá atualizar o campo abbreviation. Caso não encontre, o mesmo irá criar um registro novo com a description “Kilogramas” e setará a abbreviation  como “Kg”.

SoftDelete com Eloquent

O Eloquent do Laravel permite o sistema trabalhar com a metodologia de Soft Delete. 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?(se não lembra é só conferir o post Criando migrations com o Laravel 5.5) Então eu adicionei ao final o campo softDeletes.

Agora precisamos setar nossa model para trabalhar com softDelete. Para isto chamaremos a classe  SoftDeletes para usarmos, e criaremos uma variável $dates

Com tudo isto configurado, agora toda vez que executar a função delete() do Eloquent a mesma irá definir a coluna deleted_at com a data e hora do momento da exclusão.

Por fim, caso queira restaurar este dado, ficou bem fácil. Podemos executar a função restore() do Eloquent  como abaixo.

Conclusão

O Eloquent tem diversas funções para facilitar e diminuir o seu trabalho com aquelas tarefas usuais de banco de dados. Apenas com estes dois artigos que compartilhei com você deu para ter apenas uma visão básica das diversas situações que ele pode resolver.

Para quem quiser aprofundar mais nesta questão e tiver habilidades com o inglês fica a dica de dar uma lida na documentação completa do Laravel.

Compartilhe

Última atualização: 12 de setembro de 2018