如何在Yii2中删除特定型号?

rdrgkggo  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(134)

我需要从A及其相关模型中删除所有记录,除了一些模型。
例如:
A是父模型:
有一些相关的模型与关系,例如。
B -〉有一个
C -〉有多个
D -〉有一个
如果我想把A沿着B和C一起移走,但不想把D移走,怎么办?

A::deleteAll("some condition");

因此,上面的行应该删除A、B和C,但不删除D。
我看过Yii 2的文档,但它不是那么好。
任何帮助都将不胜感激。
先谢谢你。

n9vozmp4

n9vozmp41#

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代码本身看不出来。
除非您为B和C的CASCADE ON DELETE指定了触发器或外键,否则A::deleteAll()将只影响与A相关的表。
正如我所说的,ActiveRecord::deleteAll()并不创建ActiveRecord的示例,而是写入DB。您可以使用each函数创建这样的逻辑,这样您就可以创建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

相关问题