How to check if a record is new in Laravel?

LaravelEloquent

Laravel Problem Overview


I recently started using Eloquent.

When I used PHP Active Record, there was a nice function that checked if a record was loaded from the database or is a new instance. Is there something similar in Eloquent that I could use?

By new I mean:

$article = new Article;

whereas one from the database would be

$article = Article::find(1);

Laravel Solutions


Solution 1 - Laravel

All laravel models have a ->exists property.

More specifically if the model is either loaded from the database, or has been saved to the database since being created the exists property will be true; Otherwise it will be false.

If you wish to know if the model has been modified since being grabbed from the database, or simply not saved at all (aka if it needs saving) then you can use the ->isDirty() function.

The Laravel API is a useful place for this kind of information: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty and often sheds far more light than the default documentation.

Solution 2 - Laravel

Your model object has an attribute exactly designed for that. It's wasRecentlyCreated :

$item = Item::firstOrCreate(['title' => 'Example Item']);

if ($item->wasRecentlyCreated === true) {
    // item wasn't found and have been created in the database
} else {
    // item was found and returned from the database
}

For more clarification between the way exists variable works vs wasRecentlyCreated variable (copied from the comment by CJ Dennis below)

 /* Creating a model */ 
 $my_model = new MyModel; 
 $my_model->exists === false; 
 $my_model->wasRecentlyCreated === false; 
 $my_model->save(); 
 $my_model->exists === true; 
 $my_model->wasRecentlyCreated === true;

As opposed to if a model was loaded from a previous request:

/* Loading a Model */ 
$my_model = MyModel::first(); 
$my_model->exists === true; 
$my_model->wasRecentlyCreated === false;

Solution 3 - Laravel

We can use $appends on model if you will use it many times.. for example to check if the newly created comment is edited after created.

class Comment extends Model
{
     protected $appends = ['is_edited'];
    
     public function getIsEditedAttribute()
     {
          return $this->attributes['is_edited'] = ($this->created_at != $this->updated_at) ? true : false;
     }
}

You can use it like

$comment = Comment::findOrFail(1);

if($comment->is_edited){
      // write your logic here
}

Solution 4 - Laravel

$article = new Article;
var_dump($article->id); == null

$article = Article::find(1);
var_dump($article->id); == string(1) "1"

so

if ($article->id) {
     // I am existing
} else {
    // I am new
}

Solution 5 - Laravel

I am using Laravel Eloquent's updateOrCreate() method to create or update records when importing from a CSV file.

$product = $this->updateOrCreate($attributes, $values);

I wanted to count the amount of newly created records and updated records. Since the updateOrCreate() method saves the record to the database upon creation, $product->exists will always return true.

An alternative is to compare the created_at and updated_at timestamps of the model with the current time:

if($product->created_at == Carbon::now())
            $created++;
        elseif ($product->updated_at == Carbon::now())
            $updated++;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCraig WardView Question on Stackoverflow
Solution 1 - LaravelHailwoodView Answer on Stackoverflow
Solution 2 - LaravelDidier SampaoloView Answer on Stackoverflow
Solution 3 - Laravelshakee93View Answer on Stackoverflow
Solution 4 - LaravelWizzardView Answer on Stackoverflow
Solution 5 - LaravelHPageView Answer on Stackoverflow