Помогите определить ссылочную целостность в Zend Framework 1.8.3, используя модель Data Mapper - PullRequest
1 голос
/ 22 июля 2009

Я не могу определить отношение ссылочной целостности, используя отношения таблицы Zend Frameworks, как описано в руководстве .

Я исчерпал все возможные конфигурации (как мне кажется), и теперь сталкиваюсь с перспективой разработки приложения без возможности использования каскадного удаления, что нежелательно.

Может кто-нибудь увидеть, что не так или предложить какие-либо предложения?

Мой проект настраивается с использованием нового рекомендованного метода ZF 1.8.3 с datamappers, и мне интересно, не является ли это причиной, почему я не могу воспроизвести поведение, как описано в справочном руководстве. У кого-нибудь есть опыт решения этой проблемы?

Вот соответствующие части классов:

Приложение / модели / 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();

}

приложение / модели / 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
    )
);

}

приложение / модели / CommentMapper.php

… и связанная таблица, определенная классом:

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');
}

Ответы [ 2 ]

1 голос
/ 22 июля 2009

Спасибо, что обнаружили ошибку в определениях классов.

Моя проблема с получением Zend Framework для предоставления слоя DRI сузилась и теперь может быть обобщена как таковая.

Используя эти определения классов, я могу удалить пользователя, но не связанный комментарий через мой локальный UserController "public / users / delete / 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';



}
0 голосов
/ 22 июля 2009

Оооо, я вижу это сейчас. Ваши классы называются Default_Model_DbTable_Xxx, но вы называете их Xxx в своих классах. Сделайте изменения, предложенные Таркуном, и измените имена своих классов, чтобы они действовали:

, например

protected $_dependentTables = array('Comment');

и

'refTableClass' =>      'User',

становится

protected $_dependentTables = array('Default_Model_DbTable_Comment');

и

'refTableClass' => 'Default_Model_DbTable_User'
...