2009-12-27 4 views
1

Я пытаюсь создать каскадный эффект UPDATE и DELETE в базе данных MyISAM (аналогичный эффект, который вы можете создать в таблицах InnoDB с внешними ключами). Два примера таблицы:Zend_Db_Table Cascade DELETE AND UPDATE

  • альбомы
  • фото (имеет album_id столбец, который является «внешний ключ» к столу альбомов)

Теперь, когда я удалить строку в таблице альбомов, я бы как Zend_Db_Table, чтобы автоматически удалять все связанные строки в таблице фотографий. Это то, что я имею в альбомы таблице:

protected $_name = 'albums'; 

protected $_dependentTables = array(
    'Photos' 
); 

И у меня есть это в фотографии таблице:

protected $_name = 'photos'; 

protected $_referenceMap = array(
    'Album' => array(
     'columns' => array('album_id'), 
     'refTableClass' => 'Albums', 
     'refColumns' => array('id') 
    ) 
); 

Да, когда я удалить строку в таблице альбомы, фотографии из этого альбома сделать не удаляться.

Это, как я удаление альбома:

public function remove($id) 
{ 
    $where = $this->getAdapter()->quoteInto('id = ?', $id, 'INTEGER'); 
    return $this->delete($where); 
} 

ответ

3

Вам нужно настроить каскад удаления. Таким образом, ваша ссылка карта должна быть:

protected $_referenceMap = array(
'Album' => array(
    'columns' => array('album_id'), 
    'refTableClass' => 'Albums', 
    'refColumns' => array('id'), 
    'onDelete' => self::CASCADE 
)); 

Посмотреть полное описание каскадных операций здесь: http://framework.zend.com/manual/en/zend.db.table.relationships.html#zend.db.table.relationships.cascading

каскадных операции NB только срабатывает, когда функции вызываются по фактической строке набора результатов (т.е. Zend_Db_Table_Row класс). Чтобы запустить функцию удаления в этом примере:

$album = $albums->find($id); 
$album->delete();//This triggers the cascading delete 
+0

Да, я добавил, что там и все еще это не работает. –

+0

каскадная операция запускается только при вызове функции удаления в строке, то есть $ album-> delete(); – Akeem

+0

Да, я знаю, я использую $ this-> delete. Проверьте мой OP. –