IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Suppression en cascade


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Par défaut Suppression en cascade
    Bonjour,

    j'utilise mysql et zend framework.
    Je voudrais utiliser la suppression en cascade.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Content_Model_DbTable_Item extends Zend_Db_Table_Abstract {
     
    	protected $_name = 'item';
    	protected $_primary = 'id';
    	protected $_dependentTables = array('Content_Model_DbTable_Page');
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Content_Model_DbTable_Page extends Zend_Db_Table_Abstract {
     
    	protected $_name = 'page';
    	protected $_primary = array('id_item', 'page_number');
    	protected $_sequence = false;
     
    	protected $_referenceMap = array(
    		'Item' => array(
    			'columns' => 'id_item',
    			'refTableClass' => 'Content_Model_DbTable_Item',
    			'onDelete'          => self::CASCADE,
    	));
    }
    Je voudrais que quand je supprime un item, les pages correspondante soit supprimé. J'ai bien suivi la doc, mais quand je suprime un item sa supprime pas ces pages correspondantes.

    Si vous pouviez m'aider.

    Merci d'avance pour votre reponse

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    essaye en indiquant la clé primaire dans la table "Item" comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        protected $_referenceMap = array(
            'Item' => array(
                'columns' => 'id_item',
                'refTableClass' => 'Content_Model_DbTable_Item',
                'refColumns' => 'id',
                'onDelete' => self::CASCADE,
            )
        );

  3. #3
    Membre éclairé Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Par défaut
    Sa ne marche pas non plus.

    Voici la strucure de mes table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    --
    -- Table structure for table `item`
    --
     
    CREATE TABLE IF NOT EXISTS `item` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_category` int(11) NOT NULL,
      `title` text NOT NULL,
      `summary` text NOT NULL,
      `status` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ;
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `page`
    --
     
    CREATE TABLE IF NOT EXISTS `page` (
      `id_item` int(11) NOT NULL,
      `page_number` int(11) NOT NULL,
      `title` text NOT NULL,
      `content` text NOT NULL,
      PRIMARY KEY (`id_item`,`page_number`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

  4. #4
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    1. nosferapti a raison tu dois ajouter 'refColums', par contre ce n'est pas dans la table Item mais dans la table Page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Content_Model_DbTable_Page extends Zend_Db_Table_Abstract {
     
        protected $_name = 'page';
        protected $_primary = array('id_item', 'page_number');
        protected $_sequence = false;
     
        protected $_referenceMap = array(
            'Item' => array(
                'columns' => 'id_item',
                'refTableClass' => 'Content_Model_DbTable_Item',
                'refColumns' => 'id',
                'onDelete'          => self::CASCADE,
        ));
    }
    2. Si les enregistrements ne se suppriment pas en cascade c'est sûrement parce que tu requête l'effacement directement dans ta classe de table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $TItem = new Content_Model_DbTable_Item();
     
    // ça ça ne marche pas
    $TItem->delete('id = 29');
     
    // par contre ça ça marche (enfin chez moi!)
    $item = $TItem->find(29)->current();
    $item->delete();

  5. #5
    Membre éclairé Avatar de snyfir
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 246
    Par défaut
    Effectivement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $item = $TItem->find(29)->current();
    $item->delete();
    sa marche.

    C'est un peut bête, sa veut dire que si m'on critère de suppression n'est pas une clé primère alors je peux pas faire marcher la cascade. Par exemple, si je veux supprimer tout les item qui date de plus de 3 jours, je ne peut pas utiliser find et donc pas faire fonctionne le mecanisme de cascade.

  6. #6
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par snyfir Voir le message
    C'est un peut bête, sa veut dire que si m'on critère de suppression n'est pas une clé primère alors je peux pas faire marcher la cascade. Par exemple, si je veux supprimer tout les item qui date de plus de 3 jours, je ne peut pas utiliser find et donc pas faire fonctionne le mecanisme de cascade.
    oui c'est ça
    il y a autre chose qui fait que je ne pense pas utiliser ce système dans mes futures utilisation : la suppression en cascade se fait directement dans la base de données et l'appel de "delete()" pour les éléments enfants n'est pas fait. ça peut poser des problème s'il y a des traitements supplémentaire de nettoyage à faire

  7. #7
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Pas tout à fait en fait, ça ne marchera que si tu obtiens un row ou un rowSet en résultat.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $items = $TItem->fetchAll('where date > 3 jours'); // retourne un rowset
    foreach ($item as $item) {
    $item->delete(); // Suppresion en cascade
    }
    Mais personnellement, je préfère utiliser l'intégrité référentielle de MySQL

Discussions similaires

  1. Suppression en cascade
    Par music03 dans le forum Installation
    Réponses: 1
    Dernier message: 29/07/2005, 20h47
  2. suppression en cascade dans formulaire et sous-formulaire
    Par tooneygirl dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 14h17
  3. Requetes de suppression en cascade
    Par log2n dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/05/2005, 10h07
  4. Suppression en cascade
    Par log2n dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2005, 20h33
  5. [debutant]suppression en cascade
    Par christophebmx dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 03/05/2005, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo