如何检查对象/行是否仍被另一个对象引用


How to Check if object/row is still referenced by another object?

众所周知,如果一个数据库行被另一个数据库行引用,除非首先删除引用的数据库行,否则无法删除该数据库行。

我已经使用 Yii 一段时间了,我有一个问题,这是我的场景:

假设您加载了两种类型的对象:

$object1 = Model1::model()->findByPk($pk);
$object2 = Model2::model()->findByPk($pk);

现在每个 $object 1 都有引用 $object 2 的外键,我们都知道如果给定 fk 关系尚未删除 $object 1,则无法删除 $object 2。Yii 中是否有一种方法/函数可以检查是否有其他对象仍然被引用到 $object 2

喜欢:

if(//$object2 has no longer any other objects referring to it){
$object2->delete();
//do something here
}

我知道这可以通过确保首先删除 $object 1 来完成。但是,无论是否删除 object1,是否有一个函数可以执行此检查?任何想法或代码都会有所帮助!

这确实是一个数据库问题。您基本上需要对与您尝试删除的表相关的每个表外键进行查询

但是根据您的要求,有许多解决方案

但最简单的方法是捕获尝试删除时引发的数据库异常

例如

try
{
    $object2->delete();
}
catch(CDbException $ex)
{
    //unable to delete code here
}

这是非常基本的,因为您不知道哪些表会导致外键冲突。

否则你需要编写代码来检查每个外键(这也许可以使用 Yii 拥有的数据库元数据来完成)