O métodos Laravel firstOrNew, firstOrCreate, firstOr e updateOrCreate

Se já trabalhaste com o Laravel, provavelmente conheces alguns métodos que o Eloquent fornece para criar Models como por exemplo o make()
, create()
, update
ou save()
. O Laravel incluí outros métodos que podem ser realmente uteis para criar ou alterar Models que de certo, caso não conheças, acharás espetaculares.
Vou então apresentar e explicar o funcionamento de esses métodos.
firstOrNew
O método firstOrNew
é útil para procurar um Model que obedeça a alguma condição ou caso contrário criar um novo.
Verifica o seguinte exemplo para perceberes melhor:
$user = User::where('email', request('email'))->first();
if ($user === null) {
$user = new User(['email' => request('email')]);
}
$user->name = request('name');
$user->save()
No código anterior demos ordem para procurar um User com um determinado email, verificamos no statment IF se ele existe. Se não existir vamos criá-lo para depois alterarmos o atributo “name” e salvá-lo no fim. Simples certo??? CERTO. Mas não tanto como a seguir:
$user = User::firstOrNew(['email' => request('email')]);
$user->name = request('name');
$user->save()
Quando usamos o método firstOrNew o código fica muito mais simplificado e legível. Podes ainda adicionar mais atributos se não existir o primeiro atributo de pesquisa.
$user = User::firstOrNew(
['email' => request('email')],
['name' => request('name')]
);
$user->save();
firstOrCreate
O método firstOrCreate
é muito parecido com o firstOrNew
. A principal dirença é que com este método se não encontra o Model ele criar e salva automaticamente o novo Model, podendo igualmente serem adicionados quaisquer novos atributos que estejam previamente definidos no Model
$user = User::firstOrCreate(
['email' => request('email')],
['name' => request('name')]
);
// Não é necesário chamar $user->save()
firstOr
Mais recentemente e depois de surgir esta necessidade num dos meus projectos, encontrei o método firstOr
. Este metodo retorna o primeiro Model de uma determinada query ou se não for encontrado, permite chamar uma função anómina como callback. Este método pode ser realmente util se necessitares executar alguma tarefa adicional quando fores criar um determinado Model.
$user = User::where('email', request('email'))->firstOr(function () {
$account = Account::create([ //... ]);
return User::create([
'account_id' => $account->id,
'email' => request('email'),
]);
});
updateOrCreate
O método updateOrCreate
tenta encontrar um Model que corresponda a uma ou mais condições passadas no primeiro parâmetro. Se essas condições não forem satisfeitas o método irá fazer update dos atributos passados nos parâmetros seguintes, respeitando as condições passadas anteriormente.
Vejamos o antes e o depois:
$user = User::where('email', request('email'))->first();
if ($user !== null) {
$user->update(['name' => request('name')]);
} else {
$user = User::create([
'email' => request('email'),
'name' => request('name'),
]);
}
// Fazer outras tarefas com o $user
Vamos agora alterar o código e usar o método updateOrCreate().
$user = User::updateOrCreate(
['email' => request('email')],
['name' => request('name')]
);
// Fazer outras tarefas com o $user
Conclusão
Depois desta apresentação, penso que estes métodos realmente podem ajudar muito na “limpeza” do teu código em certas circunstâncias e são grandes opções para serem utilizadas nos teus projectos. Estes pequenos detalhes são importantissimos, pois podem ajudar na melhoria do código, facilitam tarefas e tornam o teu trabalho simples e divertido.