How to check if a record is new in Laravel?

后端 未结 5 1860
星月不相逢
星月不相逢 2020-12-30 19:11

I recently started using Eloquent.

When I used PHP Active Record, there was a nice function that checked if a record was loaded from the database or is a new instan

相关标签:
5条回答
  • 2020-12-30 19:18
    $article = new Article;
    var_dump($article->id); == null
    
    $article = Article::find(1);
    var_dump($article->id); == string(1) "1"
    

    so

    if ($article->id) {
         // I am existing
    } else {
        // I am new
    }
    
    0 讨论(0)
  • 2020-12-30 19:27

    We can use $appends on model if you will use it many times.. for example to check if the newly created comment is edited after created.

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

    You can use it like

    $comment = Comment::findOrFail(1);
    
    if($comment->is_edited){
          // write your logic here
    }
    
    0 讨论(0)
  • 2020-12-30 19:32

    I am using Laravel Eloquent's updateOrCreate() method to create or update records when importing from a CSV file.

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

    I wanted to count the amount of newly created records and updated records. Since the updateOrCreate() method saves the record to the database upon creation, $product->exists will always return true.

    An alternative is to compare the created_at and updated_at timestamps of the model with the current time:

    if($product->created_at == Carbon::now())
                $created++;
            elseif ($product->updated_at == Carbon::now())
                $updated++;
    
    0 讨论(0)
  • 2020-12-30 19:37

    All laravel models have a ->exists property.

    More specifically if the model is either loaded from the database, or has been saved to the database since being created the exists property will be true; Otherwise it will be false.

    If you wish to know if the model has been modified since being grabbed from the database, or simply not saved at all (aka if it needs saving) then you can use the ->isDirty() function.

    The Laravel API is a useful place for this kind of information: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty and often sheds far more light than the default documentation.

    0 讨论(0)
  • 2020-12-30 19:44

    Your model object has an attribute exactly designed for that. It's 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
    }
    

    For more clarification between the way exists variable works vs wasRecentlyCreated variable (copied from the comment by CJ Dennis below)

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

    As opposed to if a model was loaded from a previous request:

    /* Loading a Model */ 
    $my_model = MyModel::first(); 
    $my_model->exists === true; 
    $my_model->wasRecentlyCreated === false;
    
    0 讨论(0)
提交回复
热议问题