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);
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.
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
}
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
}
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++;
$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
}