当我使用InnoDB表时,我从InnoDB引擎中捕获了FK约束异常。
我知道Yii可以根据relations()获取相关的表。此外,我需要在其他CRUD操作期间检查参照完整性 - 例如插入,更新和删除。
是否有一些Yii本机机制来执行此操作?或者我应该为此检查编写额外的代码?
答案 0 :(得分:1)
为了避免数据库中的错误,您需要编写其他代码来处理此问题。我使用我的模型的beforeDelete()方法来管理它。写一个if条件来检查引用模型关系的参照完整性违规。然后,您可以删除有问题的记录或通过不返回'parent :: beforeDelete()来中止删除。
在User模型的这个多对多示例中,我们可以在if中包含'return parent :: beforeDelete()'调用,以便以下列方式检查模型的relations():
protected function beforeDelete() {
if (empty($this->tasks))
return parent::beforeDelete();
}
如果发现用户有任何已分配的任务,则中止删除。
作为参考,模型中的关系看起来像这样,需要第三个表:
'tasks' => array(self::MANY_MANY, 'Task', 'task_assignment(user_id,task_id)'),
此示例非常基本,显然您可能希望实现更复杂的方法来处理这些方案,其中可能包括删除相关记录,甚至更新它们以删除其外键引用。你必须决定什么是最好的,并且对你的每个模型及其关系都有意义。