Les requêtes de suppression étendant les requêtes de mise à jour, il est conseillé de commencer par la lecture de
UPDATE.
Toutes les méthodes des requêtes de sélection sont accessibles dans les requêtes DELETE.
Cependant, certaines n'auront aucun impact sur le texte SQL généré.
Voici les éléments qui sont conservés ou ignorés :
| DELETE | Conservés | Ignorés |
| SELECT | | X |
| JOIN | X | |
| WHERE | X | |
| GROUP BY | | X |
| ORDER BY | X | |
Création d'une requête DELETE
Pour créer une requête DELETE il faut lui passer la liste des objets que l'on souhaite supprimer
<?php
$q = City::query(TRUE);
$q->whereAnd('country', '=', 'America');
$objects = $db->execQuery($q)->data;
$deleteQuery = new DeleteQuery($objects);
echo $deleteQuery->toSQL(); // Affiche
// DELETE FROM city WHERE id IN (:v1, :v2)
DeleteQuery prend en paramètre soit un seul objet, soit une liste d'objets à supprimer.
Après l'exécution de la requête, chaque objet supprimé passera à l'état
DELETED
Exécution de la requête
Il faut utiliser la méthode
execDelete()
<?php
$nbDeleted = $db->execDelete($deleteQuery); // Renvoi le nombre de lignes réellement supprimées
Ajout de clause WHERE
Comme pour les requêtes UPDATE, on peut ajouter une clause WHERE afin de restreindre la portée de la suppression.
Par défaut l'exécution de la requête s'attend à avoir autant de lignes supprimées que d'objets passés en paramètre.
Si la clause WHERE ajoutée modifie cela, il faut indiquer NULL en 2ème paramètre de execDelete() afin de ne pas lever d'exception
<?php
$deleteQuery->whereAnd(...);
$nbDeleted = $db->execDelete($deleteQuery, NULL); // NULL permettra de dire qu'on ne sait pas combien d'objets vont réellement être supprimés
Delete multiple
Comme pour l'UPDATE à nouveau, on peut réaliser un DELETE multiple en utilisant la méthode statique
deleteQuery et
allowMultipleChange ensuite :
<?php
$deleteQuery = City::deleteQuery();
$deleteQuery->allowMultipleChange();
$nbDeleted = $db->execDelete($deleteQuery);
Elle fonctionne exactement de
la même manière que pour l'UPDATE.

Dans le cas où l'on utilise un DELETE multiple pour supprimer un objet sans l'avoir lu préalablement, on n'a aucun moyen de vérifier
que l'objet n'a pas été modifié par un autre utilisateur. Cette fonctionnalité est donc incompatible avec un mécanisme de locking.
Protection contre les DELETE sans clause WHERE
La même protection existe que pour
les requêtes UPDATE