【问题标题】:How to delete specific models in Yii2?Yii2中如何删除特定模型?
【发布时间】:2017-12-28 15:30:15
【问题描述】:

我需要从 A 及其相关模型中删除除某些模型/s 之外的所有记录。

例如

A 是父模型:

有一些相关的模型,例如:

B -> 有一个

C -> hasMany

D -> hasOne

如果我想将 A 连同 B 和 C 一起删除,而不是 D,该怎么办?

A::deleteAll("some condition");

所以上面一行应该删除 A、B 和 C 而不是 D。

我看过 Yii2 的文档,但不是很好。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 您可以在数据库中执行此操作,“ON DELETE...”。
  • 您是否在数据库中编写了自定义触发器?
  • 没有相互关系,deleteAll会在父模型中找到相关的模型并删除相应的条目

标签: php mysql activerecord yii yii2


【解决方案1】:

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 直接在数据库上运行,因此 - 正如一些 cmets 建议的那样 - 通过使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多