Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je cherche à savoir s'il est possible de supprimer en cascade sur plusieurs niveaux.
J'ai 3 tables : gamme, rayon, produit (1 gamme contient n rayons et un rayon contient n produits).
J'ai trois classes : Gammes, Rayons, Produits (toutes les $_referenceMap et $_dependentTables sont indiquées)
Lorsque je supprime un rayon, les produits associés sont bien supprimés.
Lorsque je supprime une gamme, les rayons associés sont bien supprimés MAIS pas les produits associés aux rayons.
Ci-dessous le code de mes classes.
class Gammes extends Zend_Db_Table_Abstract
{
protected $_name = 'gamme';
protected $_primary = 'gam_id';
protected $_dependentTables = array('Rayons');
}
class Rayons extends Zend_Db_Table_Abstract
{
protected $_name = 'rayon';
protected $_primary = 'ray_id';
protected $_dependentTables = array('Produits');
protected $_referenceMap = array(
'gamme' => array(
'columns' => 'gam_id',
'refTableClass' => 'Gammes',
'refColumns' => array('gam_id'),
'onDelete' => self::CASCADE
)
);
}
class Produits extends Zend_Db_Table_Abstract
{
protected $_name = 'produit';
protected $_primary = 'pro_id';
protected $_referenceMap = array(
'rayon' => array(
'columns' => 'ray_id',
'refTableClass' => 'Rayons',
'refColumns' => array('ray_id'),
'onDelete' => self::CASCADE
)
);
}
Donc ma question est "simple" : peut-on directement supprimer les produits en supprimant une gamme sans définir de liaison entre produit et gamme ?
Merci à tous.
Hors ligne
Salut,
En pratique ces opérations devaient être gérées par le serveur MySQL (moteur InnoDB) qui te permet d'effectuer automatiquement ce genre d'opérations.
En configurant les relations entre tes tables, le moteur sera capable d'effectuer des suppressions en cascade. Donc je te conseille de te renseigner sur le sujet plutôt que de chercher du côté de ZF
Hors ligne
En effet, au plus il y a de logique métier sur le SGBD, au mieux c'est de manière générale, et les relations sont les premières choses à déporter :-)
Note qu'avec le SGBD ces opérations sont atomiques, dont l'intégrité des données est maintenue.
Hors ligne
Hello,
C'est dit dans la doc : "Déclarer les opérations de cascades dûes à l'intégrité référentielle dans Zend_Db_Table directement, ne doit se faire seulement si votre SGBD ne supporte pas nativement ce genre d'opérations."
A+
Dernière modification par mikaelkael (17-10-2008 23:29:47)
Hors ligne
Merci à tous pour ces réponses.
Vous vous en doutez bien, pour arriver à déclarer mes classes de cette manière, j'ai plus que parcouru la doc.... et j'ai bien vu les reco de ZEND sur l'utilisation des fonctionnalités de delete cascade et autre.
En effet je ne suis pas en INNODB mais en MYISAM ; j'ai fait ce choix pour supporter la recherche full text (ex : je recherche "cles" et je trouve "clés") et aussi pour pouvoir contrôler les suppressions en cascade :
dans certains cas de figure, on ne souhaite pas supprimer la "descendance". Dans mon cas un produit pourrait ne plus appartenir à un rayon et/ou une gamme.
Par contre si vous me dites qu'avec INNODB je peux gérer les suppressions en cascade (un coup je veux et un coup je veux pas) et qu'en plus je peux faire de la recherche fulltext sans tenir compte des accentuations de caractère... alors je suis preneur.
Ceci dit, peut-on le faire quand même avec le ZEND ?
Et si je dit des "bêtises" sur INNODB et MYISAM, vous pouvez vous lacher... j'avoue ne pas avoir fait plus de recherche que ça .... et avoir commencé mon analyse et mon dev sur des certitudes bien plantées.
Merci à tous.
Hors ligne
Salut,
Tu peux effectuer les mêmes recherches sur une table InnoDB que sur une table MyISAM. De plus, les actions en CASCADE (comme la suppression) peuvent être activées ou non. Tu peux donc configurer tes dépendances comme tu le souhaites.
C'est à toi de choisir si tu veux confier cette tâche à ton SGBD ou à Zend. Personnellement, je préfère le premier qui a en plus l'avantage de "t'obliger" à designer tes tables correctement.
Et pour plus d'informations, je te conseille de lire un bout de la doc de MySQL et d'ouvrir phpMyAdmin et t'essayer à la création de quelques tables InnoDB liées entre elles ainsi qu'à la suppresion de données. Je pense que cela te permettra d'y voir plus clair
Hors ligne
acharrex a écrit:
Tu peux effectuer les mêmes recherches sur une table InnoDB que sur une table MyISAM
Euh ben en fait ... Je te joint le lien
http://dev.mysql.com/doc/refman/5.0/fr/ … tions.html
et pour ceux que ca intéresse j'ai trouvé une "bidouille" qui permet de passer outre la contrainte innodb et recherche fulltext incompatible (j'ai pas testé)
http://www.grafactory.net/blog/post/200 … avec-Mysql
Hors ligne
Pages: 1