Многоуровневые модели зависимостей в Zend Framework - PullRequest
2 голосов
/ 11 августа 2011

Я разрабатываю приложение в Zend Framework для обработки арендной платы коммерческой компании по аренде недвижимости. Компания имеет несколько зданий, каждое из которых имеет несколько этажей, каждое из которых имеет несколько единиц.

Модели, которые я установил, просто расширяют Zend_Db_Table_Abstract, и я установил их с $_dependentTables и $_referenceMap s с каскадным удалением, так что при удалении пола все единицы в нем удаляются тоже, и когда я удаляю здание, все этажи в нем удаляются. Однако, когда я удаляю здание и этажи удаляются, удаление не распространяется каскадно на единицы каждого этажа. (редактировать: я использую MySQL, поэтому я не могу использовать ссылочную целостность на уровне БД.)

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

Можно ли каким-либо образом обновить систему, чтобы удаление каскадов происходило полностью? Есть ли способ, которым я могу изменить отношения своих классов, или мне нужно использовать что-то вроде Doctrine?

(Полагаю, я мог бы переопределить метод delete() для строки каждой таблицы или чего-то в этом роде, но я просто подумал, возможно ли это, используя функциональность отношений ZF?)

Если это поможет, вот соответствующие части определений классов:

class Buildings extends Zend_Db_Table
{
   protected $_dependentTables = array('Floors');
}

class Floors extends Zend_Db_Table
{
   protected $_dependentTables = array('Units');

   protected $_referenceMap    = array(
        'Building' => array(
            'columns'           => 'building_id',
            'refTableClass'     => 'Buildings',
            'refColumns'        => 'id',
            'onDelete'          => self::CASCADE,
      ));
}

class Units extends Zend_Db_Table
{
    protected $_referenceMap    = array(
        'Floor' => array(
            'columns'           => 'floor_id',
            'refTableClass'     => 'Floors',
            'refColumns'        => 'id',
            'onDelete'          => self::CASCADE,
       ));
}

1 Ответ

1 голос
/ 16 августа 2011

Просто чтобы быть уверенным ... Вы используете СУРБД, которая не поддерживает ссылочную целостность?

На мой вкус, проще (и более переносимо, если в будущем вы решите получить доступ к БД из другого приложения) объявлять ON DELETE CASCADE в вашей СУБД (при условии, что это разрешает), а не эмулировать ее с рамкой.

Похоже, что документация Zend Framework также дает советы в этом смысле: http://framework.zend.com/manual/en/zend.db.table.relationships.html#zend.db.table.relationships.cascading

...