53

我最近开始使用 Eloquent。

当我使用 PHP Active Record 时,有一个很好的函数可以检查记录是从数据库中加载的还是新实例。我可以使用 Eloquent 中的类似功能吗?

新我的意思是:

$article = new Article;

而来自数据库的一个是

$article = Article::find(1);
4

5 回答 5

117

所有 laravel 模型都有一个->exists属性。

更具体地说,如果模型是从数据库加载的,或者自创建以来已保存到数据库中,则该exists属性将为 true;否则会是假的。

如果您想知道模型在从数据库中获取后是否已被修改,或者根本没有保存(也就是需要保存),那么您可以使用该->isDirty()函数。

Laravel API 是此类信息的有用位置:http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty 并且 通常比默认文档更清楚。

于 2013-08-28T22:24:16.203 回答
78

您的模型对象具有专门为此设计的属性。它是最近创建的:

$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;
于 2017-08-12T13:31:39.930 回答
2

$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
}
于 2016-09-02T16:40:57.533 回答
-2
$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
}
于 2013-08-28T21:38:00.613 回答
-3

从 CSV 文件导入时,我使用 Laravel Eloquent 的updateOrCreate()方法来创建或更新记录。

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

我想计算新创建记录和更新记录的数量。由于该updateOrCreate()方法在创建时将记录保存到数据库中,$product->exists因此将始终返回true.

另一种方法是将模型的时间戳created_atupdated_at时间戳与当前时间进行比较:

if($product->created_at == Carbon::now())
            $created++;
        elseif ($product->updated_at == Carbon::now())
            $updated++;
于 2015-05-30T13:02:26.237 回答