我最近开始使用 Eloquent。
当我使用 PHP Active Record 时,有一个很好的函数可以检查记录是从数据库中加载的还是新实例。我可以使用 Eloquent 中的类似功能吗?
新我的意思是:
$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 并且 通常比默认文档更清楚。
您的模型对象具有专门为此设计的属性。它是最近创建的:
$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;
$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
}
$article = new Article;
var_dump($article->id); == null
$article = Article::find(1);
var_dump($article->id); == string(1) "1"
所以
if ($article->id) {
// I am existing
} else {
// I am new
}
从 CSV 文件导入时,我使用 Laravel Eloquent 的updateOrCreate()方法来创建或更新记录。
$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++;