Automatiser le filtrage des requêtes avec le behavior SoftDelete de Doctrine 1.x
Le behavior softDelete de doctrine est très pratique. Il permet d’automatiser la gestion des suppressions non physique en base.
Techniquement pour doctrine inférieur à 1.2, ce behavior ajoute un champ deleted de type BOOLEAN dans la table cible, qui passera à vrai lors de la suppression d’une ligne. Pour doctrine 1.2, ce champ est renommé en deleted_at et, est de type DATE. On a donc maintenant en plus la date de suppression.
1. Ajouter le behavior à une table
Prenons pour exemple une table Article suivant le schema.yml suivant :
2. Ce qui nous intéresse dans ce billet, c’est filtrer les requêtes automatiquement.
En effet, le behavior a la capacité de filtrer toutes les requêtes faite sur la table article pour ne récupérer que les lignes non supprimées. Par défaut, cette possibilité n’est pas active.
Si on se réfère à la documentation de Doctrine on lit qu’il faut activer les DQL callbacks.
On nous donne même le code qui permet de l’activer
$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
Le problème maintenant est de savoir où mettre cette ligne de code dans notre projet symfony. Dans le fichier ProjectConfiguration comme suit :
Maintenant toute vos requêtes sur la table article auront une clause WHERE ajoutée de façon automatique qui permet de ne pas récupérer les lignes supprimées.
C’est dans cette méthode vous pourrez d’ailleurs configurer un certain nombre d’autres paramètres pour Doctrine.
3 . Gestion des relations
Il reste quand même un détail à régler, les suppressions en cascade. Supposons que notre schema.yml se soit transformé comme suit :
A la suppression de l’auteur les articles associés seront supprimés physiquement de la base, puisque le cascade est géré en SQL. Il faut laisser cette gestion à doctrine en utilisant la syntaxe suivante pour continuer à utiliser le softDelete :