有没有办法使用YII本机关系检查MyIsam表的参照完整性?

时间:2013-04-05 11:05:56

标签: yii myisam referential-integrity

当我使用InnoDB表时,我从InnoDB引擎中捕获了FK约束异常。

我知道Yii可以根据relations()获取相关的表。此外,我需要在其他CRUD操作期间检查参照完整性 - 例如插入,更新和删除。

是否有一些Yii本机机制来执行此操作?或者我应该为此检查编写额外的代码?

1 个答案:

答案 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)'),

此示例非常基本,显然您可能希望实现更复杂的方法来处理这些方案,其中可能包括删除相关记录,甚至更新它们以删除其外键引用。你必须决定什么是最好的,并且对你的每个模型及其关系都有意义。