Formation PUB030 : Laravel, 2019 La suppression

30.2 Supprimer un enregistrement : delete(), destroy(), detach()


La technique à utiliser pour supprimer un enregistrement dépend du type de variable que vous avez en main.

Suppression à partir d'un identifiant (destroy())

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 :

Contrôleur Laravel (PHP)

Produit::destroy(3);

Si vous avez en main plusieurs identifiants, les enregistrements correspondants peuvent être supprimés à l'aide d'une seule commande.

Contrôleur Laravel (PHP)

Produit::destroy(2, 5, 3);

Suppression à partir d'une instance du modèle (delete())

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 :

Contrôleur Laravel (PHP)

$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.

Suppression à partir d'un Builder (delete())

La classe Builder contient elle aussi une fonction delete(). Ceci permettra de supprimer le ou les enregistrements qui correspondent à une condition.

Ex :

Contrôleur Laravel (PHP)

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 :

Contrôleur Laravel (PHP)

$categorie->produits()->delete();

Supprimer un enregistrement dans une table pivot : detach()

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 :

Contrôleur Laravel (PHP)

$facture->produits()->detach($produit_id);   // ce produit n'est plus associé à cette facture

Et pour enlever tous les produits d'une facture :

Contrôleur Laravel (PHP)

$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 :

PHP

public function produits() : BelongsToMany

{

    return $this->belongsToMany('App\Produit', 'une_table_pivot');

}

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre