La technique à utiliser pour supprimer un enregistrement dépend du type de variable que vous avez en main.
Si vous avez en main l'identifiant de l'enregistrement à supprimer, la technique la plus simple consiste à utiliser la fonction destroy(). Cette fonction est appliquée directement à la classe du modèle.
Ex :
Produit::destroy(3);
Si vous avez en main plusieurs identifiants, les enregistrements correspondants peuvent être supprimés à l'aide d'une seule commande.
Produit::destroy(2, 5, 3);
Si vous avez en main une instance du modèle (ex : un objet de type Produit), vous utiliserez la fonction delete() qui est définie dans la classe Model.
Ex :
$produit->delete();
Qu'est-ce qui est le plus efficace entre Produit::destroy($produit->id) et $produit->delete() ? Si on a en main une instance du modèle, il est préférable de travailler directement avec delete() puisque dans la fonction destroy(), Laravel se charge de retrouver l'instance du modèle puis de lui appliquer la fonction delete().
Vous pouvez constater ce fait en regardant le code de la fonction destroy() dans le fichier vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php.
La classe Builder contient elle aussi une fonction delete(). Ceci permettra de supprimer le ou les enregistrements qui correspondent à une condition.
Ex :
Produit::where('prix', '<', 2)->delete();
Ceci permet même de tirer avantage des relations Eloquent. Ainsi, on pourra supprimer tous les produits d'une catégorie comme suit :
$categorie->produits()->delete();
Dans le cas où vous désirez supprimer un enregistrement dans une table pivot sans altérer les enregistrements des deux tables liées, vous pouvez travailler avec detach().
Par exemple, pour enlever un produit d'une facture tout en conservant la facture et le produit dans leurs tables respectives :
$facture->produits()->detach($produit_id); // ce produit n'est plus associé à cette facture
Et pour enlever tous les produits d'une facture :
$facture->produits()->detach(); // il n'y a plus de produits associés à cette facture
Comment Laravel fait-il pour retrouver le nom de la table pivot dans laquelle il doit supprimer le ou les enregistrements ? Laravel regardera dans la fonction de relation codée dans le modèle (dans l'exemple précédent : produits()).
Si le nom de la table pivot est formé du nom du modèle de la première table suivi d'une barre de soulignement puis du nom du modèle de la seconde table, le tout en lettres minuscules et placé en ordre alphabétique (ex : facture_produit), Laravel saura le déduire. Sinon, le nom de la table pivot aura été spécifié comme deuxième paramètre lors de l'appel de la fonction belongsToMany().
Ex :
public function produits() : BelongsToMany
{
return $this->belongsToMany('App\Produit', 'une_table_pivot');
}
▼Publicité