How to check if a record is new in Laravel?
LaravelEloquentLaravel 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++;