Zend - Доктрина удаления каскада - PullRequest
0 голосов
/ 15 ноября 2011

Я надеюсь, что кто-то может помочь с этим.Пожалуйста,

У меня есть две таблицы в отношении «один к одному»: A и B. Я пытаюсь использовать каскад удаления, как рекомендовано в модели доктрины.

В основном в моем контроллере idсделать это:

$q = Doctrine_Query::create()
        ->delete('Tcc_Model_A i')
        ->whereIn('i.A_ID', $input->ids);
  $result = $q->execute();  

У моей модели у меня есть это:

 $this->hasMany('Tcc_Model_B', array(
            'local' => 'A_ID',
            'foreign' => 'B_ID',
            'cascade' => 'delete'
                )
            );

Несмотря на то, что первичный ключ в Tcc_Model_A правильно удален, внешние ключи (B_ID) не являются.Кто-то знает, что я делаю не так?Заранее спасибо за любую даже небольшую помощь.F.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Не пытайтесь применять каскадные операции в коде приложения.Эти операции не могут быть выполнены атомарно с помощью кода приложения.

Реализуйте каскадные операции, объявив ограничение FOREIGN KEY...ON DELETE CASCADE в вашей базе данных.Они должны обрабатываться СУБД.


Ваш комментарий:

Внешние ключи могут обеспечивать поддержку каскадных обновлений и удалений, и они действуют атомарно, так что изменения как родительских, так и зависимыхтаблицы встречаются вместе.

ALTER TABLE Tcc_Model_B ADD FOREIGN KEY (B_ID) 
  REFERENCES Tcc_Model_A(A_ID)
  ON DELETE CASCADE;

См. http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

0 голосов
/ 11 декабря 2011

Если вы используете Doctrine 2, поддержка ON DELETE CASCADE поддерживается путем настройки @ JoinColumn с параметром onDelete = "cascade" .

...