Stop checking if record exists: Eloquent methods OrCreate and OrNew

Another "hidden gem" of Laravel which is surprisingly rarely used or even known, though it's mentioned in the official Eloquent documentation. Imagine that you have a record, and you need to check if that record already exists in the database - to prevent duplicate, you wouldn't save it second time. There's an elegant way to perform it in Eloquent. Let's take an example - a user with email povilas@laraveldaily.com (real email, feel free to get in touch!). Typical code would be:
$user = User::where('email', 'povilas@laraveldaily.com')->first();
if (!$user) {
  $user = User::create([
    'email' => 'povilas@laraveldaily.com',
    'first_name' => 'Povilas',
    'last_name' => 'Korop',
  ]);
}
Now, what if I told you...
$user = User::firstOrCreate(['email' => 'povilas@laraveldaily.com'],
  ['first_name' => 'Povilas', 'last_name' => 'Korop']);
Yup, it's that easy. This sentence performs the same thing - checks the user by email, and if it doesn't exist - creates the record, filling the extra fields with the array in the second parameter. There's also a method called firstOrNew(). It works almost identically to firstOrCreate(), except that it doesn't actually create a record in DB - it just returns a new Eloquent model object which then you can modify before saving:
$user = User::firstOrNew(['email' => 'povilas@laraveldaily.com'],
  ['first_name' => 'Povilas', 'last_name' => 'Korop']);
// ... Some more manipulation on $user
$user->save();
But that's not all! You can do pretty much the same thing for updating the record. Instead of:
$user = User::where('email', 'povilas@laraveldaily.com')->first();
if ($user) {
  $user->update([
    'first_name' => 'Povilas',
    'last_name' => 'Korop',
  ]);
} else {
  $user = User::create([
    'email' => 'povilas@laraveldaily.com',
    'first_name' => 'Povilas',
    'last_name' => 'Korop',
  ]);
}
Do this:
$user = User::updateOrCreate(['email' => 'povilas@laraveldaily.com'],
  ['first_name' => 'Povilas', 'last_name' => 'Korop']);
Same logic of parameters here - Laravel will check for email field, and if it finds the record, it will get updated with first_name and last_name, otherwise new entry will be created with all those three fields. Some more info and a different example - in the official Eloquent documentation.

No comments or questions yet...

Like our articles?

Become a Premium Member for $129/year or $29/month
What else you will get:
  • 58 courses (1054 lessons, total 46 h 42 min)
  • 78 long-form tutorials (one new every week)
  • access to project repositories
  • access to private Discord

Recent Premium Tutorials