Многоуровневые модели зависимостей в Zend Framework

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

Установленные мной модели просто расширяют Zend_Db_Table_Abstract, и я установил их с помощью $_dependentTables и $_referenceMaps с каскадным удалением, так что, когда я удаляю этаж, все элементы в нем также удаляются, а когда я удаляю здание, все полы в нем удалены. Однако, когда я удаляю здание и удаляются этажи, удаление не передается каскадом на единицы каждого этажа. (изменить: я использую 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,
       ));
}

comment
Вы можете использовать InnoDB для использования ссылочной целостности и получения каскадных удалений из коробки ...   -  person Glen Solsberry    schedule 16.08.2011


Ответы (1)


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

На мой вкус, проще (и более переносимо, если вы решите получить доступ к БД из другого приложения в будущем) объявить КАСКАД НА УДАЛЕНИЕ в вашей СУБД (при условии, что это позволяет), вместо того, чтобы эмулировать его с помощью фреймворка. .

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

person dinopmi    schedule 16.08.2011
comment
Извините, я должен был сказать, что использую MySQL, который, как указано в этом разделе документации, не поддерживает ссылочную целостность. - person ChrisA; 16.08.2011
comment
@Chris Anstey: движок MySQL InnoDB поддерживает внешние ключи и каскадные действия. - person chelmertz; 16.08.2011
comment
Теперь все отлично работает - все в MySQL. Спасибо @chelmertz. Вы хотите написать ответ, чтобы я мог назначить вам награду? Или я просто отдам его динопми, раз уж он там был в основном. - person ChrisA; 17.08.2011
comment
@Chris Anstey: конечно же динопми :) - person chelmertz; 17.08.2011
comment
@chelmertz: Спасибо :) Хотя, может быть, это должно быть справедливо для нас обоих. - person dinopmi; 17.08.2011