SALT > Manuel > Tutoriel > Base de données > API Query >
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($deleteQueryNULL); // 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.
alert 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