1

众所周知,如果一个数据库行被另一个引用,它不能被删除,除非一个引用被首先删除。

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

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

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

现在每个$object1 都有引用 $object2 的外键,我们都知道如果 $object1 还没有被删除,那么 $object2 就不能被删除,因为 fk 关系。Yii 中是否有一种方法/函数可以检查是否还有其他对象仍被$object2引用?

喜欢:

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

我知道这可以通过确保首先删除 $object1 来完成。但是不管 object1 是否被删除,是否有一个函数可以做这个检查?任何想法或一段代码都会有所帮助!

4

1 回答 1

3

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

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

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

例如

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

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

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

于 2013-09-19T04:18:53.327 回答