【问题标题】:Model's find() method that always modify search criteria模型的 find() 方法总是修改搜索条件
【发布时间】:2015-04-30 12:43:25
【问题描述】:

我在我的一个模型 (Lab) 中声明了 find() 方法来修改 SQL 中的 WHERE 子句:

public static function find()
{
    return parent::find()->where(['deleted' => false]);
}

仅当直接调用find() 时才会修改搜索结果。像这样:

$dataProvider = new ActiveDataProvider([
    'query' => Lab::find(),
]);

或类似:

$labs = Lab::find()->all();

但是,当任何对该方法的调用使用自己的where()、orWhere() 或andWhere():

$labs = Lab::find()
    ->where(Lab::getWhereArray())
    ->orderBy('position')
    ->all();

然后内部修改被忽略。

这是根据docs,我可以理解。但是,如何强制我的模型始终返回修改后的结果。那么,不管怎么调用,它总是会修改搜索条件?

【问题讨论】:

  • 第二种情况用andWhere()确定不行吗?
  • 当然,当我在第二种情况下使用andWhere() 时,它会起作用。但是,这需要修改控制器中的方法调用或调用该方法的任何位置。因此,这不是这个问题的主题。我正在寻找一种解决方案,它将 100% 基于模型本身——即,无论有人如何调用我的 find() 方法,它都会总是改变搜索参数。在给定“已删除”记录的情况下应该如此。我正在考虑,如果 afterFind 在这种情况下不是我的解决方案?
  • 在覆盖 find() 中使用 andWhere 怎么样。

标签: php activerecord yii yii2


【解决方案1】:

好的,我已经在我身边测试过了。在find()-overriding 中添加andWhere() 应该可以完成这项工作。

试试吧:

public static function find()
{
    return parent::find()->andWhere(['deleted' => false]);
}

【讨论】:

  • 如果他们在哪里使用呢?我认为这种方法会失败
  • 在给定的示例中,使用了普通的“where()”,这意味着应该始终使用这个标准。为了使它工作,应该使用“andWhere()”。如果在第二个查询中使用“orWhere()”,则在第一个查询中仍将使用“andWhere()”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多