Zend CASCADE об отношениях "многие ко многим"
Я использую Zend_Db_Table_Abstract по умолчанию, чтобы установить отношения. Это мои модели:
Model_Table_Project:
protected $_name = 'projects';
protected $_dependentTables = array('Model_Table_ProjectStage');
protected $_referenceMap = array(
'User' => array(
'columns' => 'userId',
'refTableClass' => 'Model_Table_User',
'refColumns' => 'id'
)
);
public function deleteProject($id)
{
$row = $this->find($id)->current();
if ($row)
{
$row->delete();
}
else
{
throw new Zend_Exception('Cannot delete project.');
}
}
Model_Table_Stage:
protected $_name = 'stages';
protected $_dependentTables = array('Model_Table_ProjectStage');
Model_Table_ProjectStage:
protected $_name = 'projectstage';
protected $_referenceMap = array(
'Project' => array(
'columns' => 'projectId',
'refTableClass' => 'Model_Table_Project',
'refColumns' => 'id',
'onDelete' => self::CASCADE,
),
'Stage' => array(
'columns' => 'stageId',
'refTableClass' => 'Model_Table_Stage',
'refColumns' => 'id',
'onDelete' => self::CASCADE,
)
);
Теперь, когда я хочу удалить проект, используя метод deleteProject() в Model_Table_Project, он удаляет запись в таблице Project и записи в таблице ProjectStage, но не удаляет записи в таблице Stage.
Что я делаю неправильно?
1 ответ
Решение
Я нашел решение. Это была ошибка моего мышления. Решение, которое я сейчас использую:
В модели Table я вызываю $row->delete(), а в модели Row я объявил метод удаления:
public function delete()
{
$stages = $this->getStages();
foreach ($stages as $stage)
{
$stage->delete();
}
return parent::delete();
}
Таким образом, он сначала удаляет все связанные этапы, а затем удаляет сам себя.