2009-07-21 5 views
1

Je ne parviens pas à définir une relation d'intégrité référentielle à l'aide des relations de table Zend Frameworks, comme indiqué dans manual. J'ai épuisé toutes les configurations possibles (ce qui semble être le cas), et je suis maintenant confronté à la possibilité de développer l'application sans pouvoir utiliser les suppressions en cascade, ce qui n'est pas souhaitable.Aide à la définition de l'intégrité référentielle dans Zend Framework 1.8.3 à l'aide du modèle Data Mapper

Quelqu'un peut-il voir ce qui ne va pas ou offrir des suggestions?

Mon projet est configuré en utilisant la nouvelle méthode recommandée ZF 1.8.3, avec des datamappers, et je me demande si c'est une raison pour laquelle je suis incapable de reproduire le comportement comme décrit dans le guide de référence. Quelqu'un at-il une expérience de ce problème?

Voici les parties pertinentes des classes:

application/modèles/UsersMapper.php

class Default_Model_UsersMapper { 
    public function deleteUser($id, Default_Model_Users $users){ 

    $usersTable = new Default_Model_DbTable_Users();   
    $usersRowset = $usersTable->find($id);  
    $userToDelete = $usersRowset->current();  
    $userToDelete->delete(); 

} 

application/modèles/DbTable/users.php

class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract 
{ 
/** 
* @var string Name of the database table 
*/ 
protected $_name = 'users'; 

/** 
* @desc reference map 
* 
*/ 
protected $_referenceMap = array(
    'Comment' => array(
    'columns'  => array('user_id'), 
     'refTableClass' => 'Comment', 
     'refColumns' => array('id'), 
     'onDelete'  => self::CASCADE 
    ) 
); 

} 

application/modèles /CommentMapper.php

... et la table reliée par la classe:

comment.php

class Default_Model_DbTable_Comment extends Zend_Db_Table_Abstract 
{ 
/** 
* @var string Name of the database table 
*/ 
protected $_name = 'comment'; 

    /** 
* @desc Defining referential integrity here since we are using MyISAM 
* Dependent tables are referred via the class name. 
*/ 
protected $_dependentTables = array('Users'); 
} 
+0

Pourquoi avez-vous un utilisé deuxième paramètre Supprimer l'utilisateur()? Default_Model_Users $ users – hobodave

+0

C'est un peu stupide ... Et qu'en est-il de la charge automatique en classe? –

Répondre

0

Ohhhh, je vois maintenant. Vos classes s'appellent Default_Model_DbTable_Xxx, mais vous les appelez Xxx dans vos classes. Faites les changements suggérés par tharkun et changez les noms de vos classes pour qu'ils soient valides:

par exemple.

protected $_dependentTables = array('Comment'); 

et

'refTableClass' =>  'User', 

devient

protected $_dependentTables = array('Default_Model_DbTable_Comment'); 

et

'refTableClass' => 'Default_Model_DbTable_User' 
1

Merci pour repérer l'erreur dans les définitions de classe.

Mon problème pour que Zend Framework fournisse une couche DRI s'est rétréci et peut maintenant être résumé en tant que tel.

L'utilisation de ces définitions de classe, je suis en mesure de supprimer l'utilisateur, mais pas le commentaire lié par mon UserController locale « utilisateurs publics// supprimer/userId/22 »

class Default_Model_DbTable_Comment extends Zend_Db_Table_Abstract 
    { 
     /** 
     * @var string Name of the database table 
     */ 
     protected $_name = 'comment'; 

     /** 
     * @desc reference map 
     * 
     * Rows in the comment table are to be automatically deleted if the row in the 
    * User table to which they refer is deleted 
    *  
    */ 
    protected $_referenceMap = array(
     'User' => array(
      'columns'  => 'user_id', // the foreign key(s) 
      'refTableClass' => 'Default_Model_DbTable_Users', 
      'refColumns' => 'id', 
      'onDelete'  => self::CASCADE, 
     ) 
    ); 

} 
class Default_Model_DbTable_Users extends Zend_Db_Table_Abstract 
{ 
    /** 
    * @var string Name of the database table 
    */ 
    protected $_name = 'users'; 


    /** 
    * @desc Defining referential integrity here since we are using MyISAM 
    * Dependent tables are referred via the class name. 
    */ 
    protected $_dependentTables = 'Default_Model_DbTable_Comment'; 



} 
Questions connexes