Как проверить, является ли запись новой в Laravel?

Недавно я начал использовать Eloquent.

Когда я использовал PHP Active Record, была хорошая функция, которая проверяла, была ли запись загружена из базы данных или является новым экземпляром. Есть ли что-то подобное в Eloquent, что я мог бы использовать?

Под новым я подразумеваю:

$article = new Article;

тогда как один из базы данных будет

$article = Article::find(1);

person Craig Ward    schedule 28.08.2013    source источник


Ответы (5)


Все модели laravel имеют свойство ->exists.

В частности, если модель либо загружена из базы данных, либо была сохранена в базе данных с момента создания, свойство exists будет иметь значение true; В противном случае оно будет ложным.

Если вы хотите узнать, была ли модель изменена после того, как она была взята из базы данных, или она просто вообще не сохранена (то есть нуждается ли она в сохранении), вы можете использовать функцию ->isDirty().

Laravel API — полезное место для такого рода информации: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty и часто проливает гораздо больше света, чем документация по умолчанию.

person Hailwood    schedule 28.08.2013
comment
К сожалению, документация Laravel лишь поверхностно касается фреймворка. - person Pedro Moreira; 04.04.2014
comment
Не путать с методом $model->exists(), который делает что-то еще, например, подсчитывает строки в базе данных и возвращает, если count › 0 :) - person Mārtiņš Briedis; 30.04.2014

Ваш объект модели имеет атрибут, специально предназначенный для этого. Это было недавно создано:

$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
}

Для получения дополнительных разъяснений между тем, как существует переменная, работает и переменная wasRecentlyCreated (скопировано из комментария CJ Dennis ниже)

 /* 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;

В отличие от того, если бы модель была загружена из предыдущего запроса:

/* Loading a Model */ 
$my_model = MyModel::first(); 
$my_model->exists === true; 
$my_model->wasRecentlyCreated === false;
person Didier Sampaolo    schedule 12.08.2017
comment
wasRecentlyCreated указывает, была ли модель вставлена ​​во время текущего жизненного цикла запроса. Таким образом, даже если запись отсутствует в БД, она вернет только true после сохранения. - person Jack; 11.04.2018
comment
Он возвращает false, если вы создаете запись, а затем снова запрашиваете эту вновь созданную Item::firstOrCreate(['title' => 'Example Item']);, затем Item::where(['title' => 'Example Item'])->first()->wasRecentlyCreated возвращает false. Не забудьте получить возвращаемое значение методов создания. Но проблемы возникают при работе с созданием связанных моделей и запросом вновь созданных моделей. - person Julio Motol; 06.07.2020

Мы можем использовать $appends в модели, если вы будете использовать ее много раз.. например, чтобы проверить, редактируется ли вновь созданный комментарий после создания.

class Comment extends Model
{
     protected $appends = ['is_edited'];

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

Вы можете использовать его как

$comment = Comment::findOrFail(1);

if($comment->is_edited){
      // write your logic here
}
person shakee93    schedule 02.09.2016

Я использую метод Laravel Eloquent updateOrCreate(). для создания или обновления записей при импорте из CSV-файла.

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

Я хотел подсчитать количество вновь созданных записей и обновленных записей. Поскольку метод updateOrCreate() сохраняет запись в базе данных при создании, $product->exists всегда будет возвращать true.

Альтернативой является сравнение временных меток модели created_at и updated_at с текущим временем:

if($product->created_at == Carbon::now())
            $created++;
        elseif ($product->updated_at == Carbon::now())
            $updated++;
person HPage    schedule 30.05.2015
comment
Если в том же запросе, то метке времени не хватает точности, чтобы узнать, была ли запись только что создана. - person Snapey; 11.02.2021

person    schedule
comment
Хотя, возможно, это не идеально, примерно в 2013 году я чувствую, что это нормальный ответ. - person Grant; 19.06.2019