同样都知道数据库行是否被另一个引用,除非首先删除一个引用,否则不能删除它。
我已经使用Yii一段时间了,我有一个问题,这是我的情景:
假设您已加载两种类型的对象:
$object1 = Model1::model()->findByPk($pk);
$object2 = Model2::model()->findByPk($pk);
现在每个 $ object1都有外键引用$ object2 ,我们都知道如果$ object1在fk关系中尚未被删除,则无法删除$ object2。在Yii中是否有一种方法/功能可以检查是否还有其他对象仍然引用 $ object2 ?
像:
if(//$object2 has no longer any other objects referring to it){
$object2->delete();
//do something here
}
我知道这可以通过确保首先删除$ object1来完成。但无论object1是否被删除,是否有一个函数来执行此检查?任何想法或一段代码都会有所帮助!
答案 0 :(得分:3)
这确实是一个数据库问题。您基本上需要对与您要删除的表相关的每个表外键执行查询
但是根据您的要求,有许多解决方案
但最简单的方法是捕获尝试删除时抛出的数据库异常
E.g。
try
{
$object2->delete();
}
catch(CDbException $ex)
{
//unable to delete code here
}
这是非常基本的,因为您不知道哪些表会导致外键违规。
否则你需要编写代码来检查每个外键(这可能可以使用Yii拥有的数据库元数据来完成)