web-dev-qa-db-ja.com

Laravelでレコードが新しいかどうかを確認する方法は?

私は最近Eloquentを使い始めました。

PHP Active Record)を使用すると、レコードがデータベースからロードされたのか、新しいインスタンスであるのかを確認するNice関数がありました。

新しいことで私は意味する:

$article = new Article;

一方、データベースからのものは

$article = Article::find(1);
36
Craig Ward

すべてのlaravelモデルには_->exists_プロパティがあります。

より具体的には、モデルがデータベースからロードされるか、作成されてからデータベースに保存された場合、existsプロパティはtrueになります。それ以外の場合は偽になります。

データベースから取得した後にモデルが変更されたかどうか、またはまったく保存されていない場合(別名、保存が必要な場合)を知りたい場合は、->isDirty()関数を使用できます。

Laravel APIは、この種の情報に役立つ場所です。 http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty そして、多くの場合、デフォルトのドキュメントよりもはるかに軽いです。

94
Hailwood

モデルオブジェクトには、まさにそのために設計された属性があります。 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
}
32
Didier Sampaolo

何度も使用する場合は、モデルで$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
}
2
shakee93

Laravel Eloquentの pdateOrCreate() メソッドを使用して、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++;
_
0
HPage