1

InnoDB テーブルを使用しているときに、InnoDB エンジンから FK 制約の例外をキャッチしました。

私は Yii が Relations() に従って関連するテーブルを取得できることを知っています。さらに、挿入、更新、削除などの他の CRUD 操作中に参照整合性を確認する必要があります。

これを実行する Yii ネイティブのメカニズムはありますか? または、このチェック用に追加のコードを作成する必要がありますか?

4

1 に答える 1

1

データベースからのエラーを回避するには、これを処理する追加のコードを記述する必要があります。モデルの beforeDelete() メソッドを使用して管理します。モデルのリレーションを使用して、参照整合性違反をチェックする if 条件を記述します。その後、問題のあるレコードを削除するか、「parent::beforeDelete()」を返さないことで削除を中止できます。

User モデルからのこの多対多の例では、次の方法でモデルの Relations() をチェックするために、if で 'return parent::beforeDelete()' 呼び出しをラップできます。

 protected function beforeDelete() {
            if (empty($this->tasks))
            return parent::beforeDelete();
        }

ユーザーにタスクが割り当てられていることが判明した場合、削除は中止されます。

参考までに、モデルのリレーションは次のようになり、3 番目のテーブルが必要になります。

'tasks' => array(self::MANY_MANY, 'Task', 'task_assignment(user_id,task_id)'),

この例は非常に基本的なものであり、これらのシナリオを処理するより複雑な方法を実装する必要があることは明らかです。これには、関連するレコードの削除や、外部キー参照を削除するための更新も含まれます。モデルとその関係のそれぞれについて、何が最も効果的で理にかなっているのかを判断する必要があります。

于 2013-04-05T13:44:43.993 に答える