2017-12-28 22 views
0

一部のモデルを除き、Aとその関連モデルからすべてのレコードを削除する必要があります。Yii2一部のモデルを除いて削除する

Aは、親モデルである:

例えばのための関係を持ついくつかの関連のモデルがあります。

B - > hasOneの

C - > hasManyの

D - > hasOneの

私はBとCではなくD.

A::deleteAll("some condition"); 
と一緒に削除したい場合

上記の行はA、B、Cは削除しますがDは削除しないでください。

私はYii2、それはそれほど良いことではありません。

ご協力いただければ幸いです。

ありがとうございます。

+0

をあなたのデータベースにそれを行うことができ、「DELETE ON ... "。 – pat

+0

データベースにカスタムトリガーを書きましたか? – kiamoz

+0

お互いに関係がありません。また、deleteAllは、親モデルの関連モデルを見つけてそれぞれのエントリを削除します – rahulsm

答えて

3

http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#deleting-data

Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);

ここで説明するように条件が道に置かれている:

http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail

DeleteAllがそうデータベース上で直接動作します - いくつかのコメントが示唆するよう - 関連レコードを削除しますSQLを使用する場合は、SQLレベルでトリガーを使用することで可能になります。私はこれをお勧めしません。これは、十分に文書化されていない限り、PHPコード自体からは分かりません。

あなたはCASCADE ONに指定されたトリガーまたは外部キーはBとCのためにDELETEがない限り、私が言ったように:: DELETEALLは()のみのActiveRecord :: DELETEALL(A.

に関連するテーブルに影響を与えるだろう)、ActiveRecordのインスタンスを作成せず、代わりにDBに書き込みます。バッチ機能を使用してメモリを維持しながら あなたは、あなたがAのインスタンスを作成しないように、各機能を使用して、このようなロジックを作成することができます。

$transaction = \Yii::$app->db->beginTransaction(); 
$condition = []; // your condition to find A 

foreach(A::find()->where($condition)->joinWith(['b','c'])->each() as $a) { 
    foreach($a->getB()->each() as $b) { 
     $b->delete(); 
    } 
    foreach($a->getC()->each() as $c) { 
     $c->delete(); 
    } 
    $a->delete(); 
} 
$transaction->commit(); 

http://www.yiiframework.com/doc-2.0/yii-db-query.html#each()-detail

+0

ありがとうございます!あなたは救い主です!私はあなたのコンセプトとロジックを保つでしょう! – rahulsm

+0

大歓迎;) –

関連する問題