有没有一种方法可以使用YII本机关系检查MyIsam表的引用完整性?
当我使用InnoDB表时,我从InnoDB引擎捕获了FK约束异常 我知道Yii可以根据relations()获取相关表。此外,我需要在其他CRUD操作期间检查引用完整性,例如插入、更新和删除。有没有一种方法可以使用YII本机关系检查MyIsam表的引用完整性?,yii,myisam,referential-integrity,Yii,Myisam,Referential Integrity,当我使用InnoDB表时,我从InnoDB引擎捕获了FK约束异常 我知道Yii可以根据relations()获取相关表。此外,我需要在其他CRUD操作期间检查引用完整性,例如插入、更新和删除。 是否有一些Yii本地机制来执行此操作?或者我应该为此检查编写附加代码?为了避免数据库中出现错误,您需要编写附加代码来处理此问题。我使用模型的beforeDelete()方法来管理它。编写一个if条件,使用模型的关系检查引用完整性冲突。然后,您可以删除有问题的记录,也可以通过不返回“parent::bef
是否有一些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)'),
这个示例非常基本,显然,您可能希望实现一种更复杂的方法来处理这些场景,包括删除相关记录,甚至更新它们以删除它们的外键引用。您必须确定哪种方法对每个模型及其关系最有效、最有意义。为了避免数据库中出现错误,您需要编写额外的代码来处理此问题。我使用模型的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)'),
这个示例非常基本,显然,您可能希望实现一种更复杂的方法来处理这些场景,包括删除相关记录,甚至更新它们以删除它们的外键引用。您必须确定哪些最适合您的模型及其关系,哪些最适合您。您可能还需要查看软删除选项,这意味着记录永远不会从数据库中删除。tnx很多。我已经按照你的建议使用了钩子实现了这一点。一个有助于提高效率的补充:创建一个关系
'taskscont'=>数组(self::STAT,'tasksassignment','user_id'),
,并将删除前签入更改为if(!$this->taskscont)
。这样,您就不需要实际查询和加载所有任务来执行此检查,因为此新关系将只返回数据库中记录数的整数计数。Willem是对的,使用这样的额外关系来执行计数查询更有效。很好的提示。您可能还想查看软删除选项,这意味着记录永远不会从数据库中删除。tnx很多。我已经按照你的建议使用了钩子实现了这一点。一个有助于提高效率的补充:创建一个关系'taskscont'=>数组(self::STAT,'tasksassignment','user_id'),
,并将删除前签入更改为if(!$this->taskscont)
。这样,您就不需要实际查询和加载所有任务来执行此检查,因为此新关系将只返回数据库中记录数的整数计数。Willem是对的,使用这样的额外关系来执行计数查询更有效。很好的提示。