web-dev-qa-db-fra.com

Comment vérifier si un enregistrement est nouveau à Laravel?

J'ai récemment commencé à utiliser Eloquent.

Lorsque j'ai utilisé PHP Active Record, il y avait une fonction Nice qui vérifiait si un enregistrement avait été chargé à partir de la base de données ou s'il s'agissait d'une nouvelle instance. Y a-t-il quelque chose de similaire dans Eloquent que je pourrais utiliser?

Par nouveau, je veux dire:

$article = new Article;

alors que l'un de la base de données serait

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

Tous les modèles laravel ont une propriété ->exists.

Plus précisément, si le modèle est chargé à partir de la base de données ou a été enregistré dans la base de données depuis sa création, la propriété exists sera vraie; Sinon, ce sera faux.

Si vous souhaitez savoir si le modèle a été modifié depuis qu'il a été récupéré dans la base de données, ou tout simplement pas enregistré du tout (c'est-à-dire s'il a besoin d'être sauvegardé), vous pouvez utiliser la fonction ->isDirty().

L'API Laravel est un endroit utile pour ce type d'informations: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Model.html#method_isDirty et jette souvent beaucoup plus de lumière que la documentation par défaut.

94
Hailwood

Votre objet de modèle a un attribut spécialement conçu pour cela. Il a été récemment créé:

$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

On peut utiliser $appends sur le modèle si vous l'utiliserez plusieurs fois .. par exemple pour vérifier si le commentaire nouvellement créé est modifié après sa création.

class Comment extends Model
{
     protected $appends = ['is_edited'];

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

Vous pouvez l'utiliser comme

$comment = Comment::findOrFail(1);

if($comment->is_edited){
      // write your logic here
}
2
shakee93

J'utilise la méthode Laravel Eloquent pdateOrCreate () pour créer ou mettre à jour des enregistrements lors de l'importation à partir d'un fichier CSV.

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

Je voulais compter le nombre d'enregistrements nouvellement créés et d'enregistrements mis à jour. Étant donné que la méthode updateOrCreate() enregistre l'enregistrement dans la base de données lors de sa création, $product->exists Renverra toujours true.

Une alternative consiste à comparer les horodatages created_at Et updated_at Du modèle avec l'heure actuelle:

if($product->created_at == Carbon::now())
            $created++;
        elseif ($product->updated_at == Carbon::now())
            $updated++;
0
HPage