私は最近Eloquentを使い始めました。
PHP Active Record)を使用すると、レコードがデータベースからロードされたのか、新しいインスタンスであるのかを確認するNice関数がありました。
新しいことで私は意味する:
$article = new Article;
一方、データベースからのものは
$article = Article::find(1);
すべてのlaravelモデルには_->exists
_プロパティがあります。
より具体的には、モデルがデータベースからロードされるか、作成されてからデータベースに保存された場合、exists
プロパティはtrueになります。それ以外の場合は偽になります。
データベースから取得した後にモデルが変更されたかどうか、またはまったく保存されていない場合(別名、保存が必要な場合)を知りたい場合は、->isDirty()
関数を使用できます。
Laravel APIは、この種の情報に役立つ場所です。 http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty そして、多くの場合、デフォルトのドキュメントよりもはるかに軽いです。
モデルオブジェクトには、まさにそのために設計された属性があります。 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
}
何度も使用する場合は、モデルで$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
}
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++;
_