我需要从A及其相关模型中删除所有记录,除了一些模型。例如:A是父模型:有一些相关的模型与关系,例如。B -〉有一个C -〉有多个D -〉有一个如果我想把A沿着B和C一起移走,但不想把D移走,怎么办?
A::deleteAll("some condition");
因此,上面的行应该删除A、B和C,但不删除D。我看过Yii 2的文档,但它不是那么好。任何帮助都将不胜感激。先谢谢你。
n9vozmp41#
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#deleting-dataCustomer::deleteAll(['status' => Customer::STATUS_INACTIVE]);条件的设置方式如下所述:http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detailDeleteAll直接作用于数据库,因此-正如一些评论所建议的那样-通过使用SQL级别的触发器可以动态删除相关记录-只要您使用SQL。我不推荐这样做,因为这将是一种神奇的行为,除非有很好的文档记录,否则从PHP代码本身看不出来。除非您为B和C的CASCADE ON DELETE指定了触发器或外键,否则A::deleteAll()将只影响与A相关的表。正如我所说的,ActiveRecord::deleteAll()并不创建ActiveRecord的示例,而是写入DB。您可以使用each函数创建这样的逻辑,这样您就可以创建A的示例,同时使用批处理功能保留内存:
Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]);
$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
1条答案
按热度按时间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的示例,同时使用批处理功能保留内存:
http://www.yiiframework.com/doc-2.0/yii-db-query.html#each()-detail