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