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

J'ai récemment commencé à utiliser Éloquent.

Quand J'ai utilisé PHP Active Record, il y avait une belle fonction qui vérifiait si un enregistrement était 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 qu'un de la base de données serait

$article = Article::find(1);
31
demandé sur Rubens Mariuzzo 2013-08-29 01:27:20

5 réponses

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 true; sinon elle sera false.

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

L'API Laravel est un endroit utile pour ce genre de information: 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.

86
répondu Hailwood 2015-01-16 15:02:39

Votre objet modèle a un attribut exactement conçu pour cela. C'est 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
}
19
répondu Didier Sampaolo 2017-08-12 13:31:39

Nous pouvons utiliser $appends sur le modèle si vous l'utilisez plusieurs fois.. par exemple, pour vérifier si le commentaire nouvellement créé est modifié après la 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
répondu shakee93 2016-09-02 16:40:57

J'utilise la méthode updateOrCreate() de Laravel Eloquent 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. Puisque la méthode updateOrCreate() enregistre l'enregistrement dans la base de données lors de sa création, {[3] } retournera 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
répondu HPage 2015-05-30 13:02:26
$article = new Article;
var_dump($article->id); == null

$article = Article::find(1);
var_dump($article->id); == string(1) "1"

Donc

if ($article->id) {
     // I am existing
} else {
    // I am new
}
-4
répondu Wizzard 2013-08-28 21:38:00