2013-04-05 3 views
1

Пока я использовал таблицы InnoDB, я обнаружил исключения ограничения FK от движка InnoDB.Есть ли способ проверить ссылочную целостность таблиц MyIsam с использованием родственных отношений YII?

Я знаю, что Yii может получать связанные таблицы согласно отношениям(). Кроме того, мне нужно проверить ссылочную целостность во время других операций CRUD - таких как вставка, обновление и удаление.

Есть ли какой-либо механизм Yii для выполнения этого? Или я должен написать дополнительный код для этой проверки?

ответ

1

Во избежание ошибок из базы данных вам необходимо написать дополнительный код для его обработки. Я управляю им, используя метод beforeDelete() моих моделей. Напишите условие if для проверки нарушений ссылочной целостности uizing отношений модели. Затем вы можете либо удалить оскорбительные записи, либо прервать удаление, не возвращая «parent :: beforeDelete()».

В этом многие ко многим, например, от модели пользователя мы можем обернуть 'возвращения родителей :: beforeDelete() вызова в случае для проверки соотношения() модели следующим образом:

protected function beforeDelete() { 
      if (empty($this->tasks)) 
      return parent::beforeDelete(); 
     } 

Удаление отменено, если у Пользователя есть назначенные задачи.

Справочно соотношение в модели будет выглядеть, как это и требует третью таблицу:

'tasks' => array(self::MANY_MANY, 'Task', 'task_assignment(user_id,task_id)'), 

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

+2

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

+0

tnx много. Я уже использовал это, используя крючки, как вы предложили. –

+1

Полезное дополнение для повышения эффективности: создайте отношение '' tasksCount '=> array (self :: STAT, «TaskAssignment», «user_id») »и измените проверку' beforeDelete' на 'if (! $ this-> tasksCount) '. Таким образом, вам не нужно на самом деле запрашивать и загружать все задачи для выполнения этой проверки, так как это новое отношение просто вернет целочисленный подсчет количества записей в базе данных. –