Я разрабатываю приложение в 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,
));
}