1

データベースの行が別の行から参照されているかどうかはよく知られていますが、参照している行が最初に削除されない限り、削除することはできません。

私は Yii をしばらく使用していますが、質問があります。私のシナリオは次のとおりです。

2 種類のオブジェクトをロードしたとします。

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

これで、各$object1 には $object2 を参照する外部キーがあり、fk 関係を考慮して $object1 がまだ削除されていない場合、$object2 を削除できないことがわかります。$object2をまだ参照している他のオブジェクトがあるかどうかをチェックする方法/関数が Yii にありますか?

お気に入り:

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 に答える