有没有一种方法可以使用YII本机关系检查MyIsam表的引用完整性?

有没有一种方法可以使用YII本机关系检查MyIsam表的引用完整性?,yii,myisam,referential-integrity,Yii,Myisam,Referential Integrity,当我使用InnoDB表时,我从InnoDB引擎捕获了FK约束异常 我知道Yii可以根据relations()获取相关表。此外,我需要在其他CRUD操作期间检查引用完整性,例如插入、更新和删除。 是否有一些Yii本地机制来执行此操作?或者我应该为此检查编写附加代码?为了避免数据库中出现错误,您需要编写附加代码来处理此问题。我使用模型的beforeDelete()方法来管理它。编写一个if条件,使用模型的关系检查引用完整性冲突。然后,您可以删除有问题的记录,也可以通过不返回“parent::bef

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

我知道Yii可以根据relations()获取相关表。此外,我需要在其他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)'),

这个示例非常基本,显然,您可能希望实现一种更复杂的方法来处理这些场景,包括删除相关记录,甚至更新它们以删除它们的外键引用。您必须确定哪种方法对每个模型及其关系最有效、最有意义。

为了避免数据库中出现错误,您需要编写额外的代码来处理此问题。我使用模型的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是对的,使用这样的额外关系来执行计数查询更有效。很好的提示。