【问题标题】:Yii2, Softdelete, self::tableName(), and ignoring `deleted` recordsYii2、Softdelete、self::tableName() 和忽略 `deleted` 记录
【发布时间】:2016-03-04 02:13:44
【问题描述】:

我有一个包含 SoftDelete 行为的基本模型类 (cornernote/yii2-softdelete)。删除记录后,表 deleted_at 中的列将填充时间戳。

尝试覆盖 base 模型中的 find() 方法,但 self::className() 不返回带有名称的表前缀。

return parent::find()->where([self::tableName() . '.deleted_at' => null]);

我必须将它添加到每个模型类中才能获得正确的(完整)表名。

问题:如何最好地忽略已填充列的表中的记录。该解决方案必须在 ActiveDataProvider([...])、find()->...one() 和 find()->...all() 情况下访问模型时起作用。

TIA

【问题讨论】:

  • 你也可以使用SoftDeleteQueryBehavior
  • @soju 请详细说明/提供参考。
  • 看看我的回答,关于SoftDeleteQueryBehavior看看cornernote/yii2-softdelete doc
  • 很奇怪,我的原始类中确实有 ActiveQuery 行为,但似乎不起作用。请在回复中更详细一点。感觉方向正确但不完整。
  • 做出选择,我的回答会解决你原来的问题。关于 SoftDeleteQueryBehavior 仔细阅读文档并在需要时提出另一个问题...

标签: php activerecord yii2 soft-delete


【解决方案1】:

您应该阅读这篇关于后期静态绑定的文章:

http://php.net/manual/en/language.oop5.late-static-bindings.php

后期静态绑定引入了 static 关键字,该关键字引用了最初在运行时调用的类

因此,您应该简单地使用 static::tableName() 而不是 self::tableName()

【讨论】:

    【解决方案2】:

    我认为你应该使用Customized Query Class

    它已经存在于库中,你正在使用什么 - here github

    如果你愿意 - 你也可以重新定义find 方法。

    【讨论】:

    • 确实,我试图覆盖基本模型 find() 但我必须拥有类表名。 tableName() 不返回表前缀,因此找不到表。
    • @Pheagey 为什么需要表名?你能分享一下你的模型代码吗?
    猜你喜欢
    • 2016-05-15
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2014-05-07
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多