【问题标题】:How to say (a AND b) OR (c AND d) in a YII2 ActiveRecord query?如何在 YII2 ActiveRecord 查询中说 (a AND b) OR (c AND d)?
【发布时间】:2015-08-06 15:19:03
【问题描述】:

我在使用 YII2 的 ORM 时遇到了困难,它没有记录一些非常简单的典型 SQL 案例,例如

伪代码

SELECT * FROM table WHERE (a=1 AND b=2) OR (a=3 AND b=4)

我的尝试:

// should represent the commented logic, but does not
Demo::find()
    ->where(...) // ( condition one
    ->andWhere(...) // AND condition two )
    ->orWhere(...) // OR (!) ( condition three
    ->andWhere(...) // AND condition four )

问题:

在 YII2 中,where() 方法不允许“嵌套”查询,这就是我遇到的问题。 YII2 只允许说简单的 AND .. OR costructs,绝不是一组 AND 在一起。

【问题讨论】:

    标签: php activerecord orm yii2


    【解决方案1】:

    where() 方法允许嵌套条件:

    Demo::find()->where(['or', ['a' => 1, 'b' => 2], ['a' => 3, 'b' => 4]]);
    

    官方文档here中有一些例子。

    更复杂的例子(正如你在评论中问的那样):

    Demo::find()->where([
        'or',
        ['and', ['not in', 'a' => [1, 2]], ['not in', 'b' => [3, 4]]],
        ['a' => [5, 6]], 'b' => [7, 8]],
    ]);
    

    另一个例子可以在类似的问题here中找到。

    【讨论】:

      【解决方案2】:

      你可以这样做

      Demo::find()
          ->where('(a = :a AND b = :b)', [
              ':a' => 'bla',
              ':b' => 'bla',
          ])
          ->orWhere('(c = :c AND d = :d)', [
              ':c' => 'bla',
              ':d' => 'bla',
          ]);
      

      文档http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where()-detail 很好地解释了 where 选项的可能性。包括如何使用子查询。

      andor 说明说明了如何以不同于上述方式的方式创建集合。

      【讨论】:

      • 谢谢,很好的回答,但不幸的是,这确实支持x => 1 语法,但不支持 NOT、NOT IN 等结构。
      【解决方案3】:
      Demo::find()->where('a=1 and b=2 or f=3')->one();
      

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 1970-01-01
        • 2015-11-29
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 2017-12-29
        相关资源
        最近更新 更多