2015-08-19 85 views

回答

8

下面是使用yii\db\Expression选项之一:

use yii\db\Expression; 

... 

$models = Customer::find() 
    ->select(['id', 'name', ...]) 
    ->where(new Expression('id % 2 = 1')]) 
    ->all(); 

它比原始的SQL ['%2=', 'id', 1] definetely更好,因为它遵循的顺序,在我看来更具有可读性。

['%2=', 'id', 1]也不适合在这里,因为%2=实际上不是像not inlike例如操作员,操作员这样,价值和=符号被种混合在一起。

官方文档:

更新:我问samdark,在官方的Gitter主体框架贡献者之一聊天,他说,正确的方式它是否使用yii\db\Expression

+0

当Expression对象嵌入到SQL语句或片段中时,它将被替换为$ expression属性值'不带任何数据库转义或引用'。现在,我明白这是意思。 – haoliang

+0

但对象(新表达式)不能是数组中的键。它的工作原理如下:' - > where(new Expression('id%2 = 1'))' – haoliang

+0

这样,where(new Expression('id%2 = 1')' 'id%2 = 1')'.lol。 – haoliang

4

您可以使用ActiveQuerywhere(),您的$conditions将是('id % 2 = 1')

+0

为什么'switch'在这里需要? – arogachev

+0

@arogachev它不是必需的,它是一个例子,它使得查询更容易阅读,以防用户不喜欢使用'$ conditions'变量。 – Zack

+0

实际上很少需要'$ conditions'变量。相反,您可以使用'$ query'变量并有条件地添加查询的不同部分。 – arogachev

6

您也可以使用Active Query来实现此目的。这可能有帮助。

$customers = Customer::find() 
    ->select(['id', 'name', ...]) 
    ->where('id % 2 = 1') 
    ->all(); 

$customers = Customer::find() 
    ->select(['id', 'name', ...]) 
    ->where(['% 2 =', 'id', 1]) 
    ->all(); 

Reference

+0

哦,Yii将第一个元素作为第二个和第三个之间的操作符处理。 – haoliang

+0

@haoliang这是在官方文档[这里](http://www.yiiframework.com/doc-2.0/yii-db-queryinterface.html#where%28%29-detail)desribed。 – arogachev

+0

谢谢@arogachev我读过你的答案,非常有用。 – ankitr