Métodos de Laravel: firstOrNew, firstOrCreate, firstOr, y updateOrCreate


Victor Arana Flores

14 Aug 2022

Si has estado trabajando con Laravel durante algún tiempo, probablemente conozcas los métodos estándar para crear Modelos Eloquent como make(), create(), update y save(). Laravel incluye algunos otros métodos que también son realmente útiles para crear y actualizar Modelos que creo que no reciben suficiente atención. Así que en este artículo, me gustaría repasar algunos de estos métodos adicionales y explicar cómo pueden ser útiles.

firstOrNew

El método firstOrNew es realmente útil para encontrar el primer Modelo que coincida con algunas restricciones o para hacer uno nuevo si no hay ninguno que coincida con esas restricciones.

Puedes tomar un trozo de código que se parezca a esto:

$user = User::where('email', request('email'))->first();
 
if ($user === null) {
    $user = new User(['email' => request('email')]);
}
 
$user->name = request('name');
 
$user->save()

Y convertirlo en esto:

$user = User::firstOrNew(['email' =>  request('email')]);
 
$user->name = request('name');
 
$user->save()

También puede pasar una matriz de atributos adicionales para establecer como segundo parámetro si no se encuentra ningún Modelo existente:

$user = User::firstOrNew(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
$user->save();

firstOrCreate

El método firstOrCreate es muy similar al método firstOrNew. Intenta encontrar un modelo que coincida con los atributos que se pasan en el primer parámetro. Si no se encuentra un modelo, crea y guarda automáticamente un nuevo modelo después de aplicar los atributos pasados en el segundo parámetro:

$user = User::firstOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
// No es necesario llamar a $user->save()

firstOr

Recientemente encontré el método firstOr mientras buceaba en la fuente. El método firstOr recupera el primer Modelo de una consulta, o si no se encuentra ningún Modelo que coincida, llamará a un callback pasado. Esto puede ser realmente útil si necesitas realizar pasos adicionales al crear un usuario o quieres hacer algo más que crear un nuevo usuario:

$user = User::where('email', request('email'))->firstOr(function () {
    $account = Account::create([ //... ]);
 
    return User::create([
        'account_id' => $account->id,
        'email' => request('email'),
    ]);
});

updateOrCreate

El método updateOrCreate intenta encontrar un Modelo que coincida con las restricciones pasadas como primer parámetro. Si se encuentra un modelo que coincida, se actualizará la coincidencia con los atributos pasados como segundo parámetro. Si no se encuentra un modelo que coincida, se creará un nuevo modelo con las restricciones pasadas como primer parámetro y los atributos pasados como segundo parámetro.

Puede refactorizar este fragmento de código:

$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'),
    ]);
}
 
// Hacer otras cosas con el usuario

Para ello se utiliza el método updateOrCreate:

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
// Hacer otras cosas con el usuario

Conclusión

¡En general, creo que estos métodos pueden ayudar a limpiar su código en ciertas circunstancias y son grandes opciones para tener en su cinturón de herramientas! Hazme saber si conoces algún otro que sea realmente útil y no sea muy conocido. Me encanta aprender sobre estos pequeños detalles que hacen que sea tan agradable trabajar con Laravel.

Traducido del blog de Laravel New


1 comentarios

Inicia sesión para comentar

Comentarios:

  • Walter Ramos

    Walter Ramos hace 1 año

    Totalmente, me quedo con el final de post, “Me encanta aprender sobre estos pequeños detalles que hacen que sea tan agradable trabajar con Laravel”. Excelente post Victor!