Activerecord 如何构建像“选择”这样的查询。。。其中id%2=1`使用yii2?;

Activerecord 如何构建像“选择”这样的查询。。。其中id%2=1`使用yii2?;,activerecord,yii2,Activerecord,Yii2,当然,我可以Yii::$app->db->createCommand($sql)->query(), 但是如果我想使用一个ActiveRecord::find()->where($conditions)来做这个工作呢?您可以使用类,您的$conditions将是('id%2=1')您也可以使用活动查询来实现这一点。这可能会有所帮助 $customers = Customer::find() ->select(['id', 'name', ...]) ->where('

当然,我可以
Yii::$app->db->createCommand($sql)->query(),

但是如果我想使用一个
ActiveRecord::find()->where($conditions)
来做这个工作呢?

您可以使用类,您的
$conditions
将是
('id%2=1')
您也可以使用活动查询来实现这一点。这可能会有所帮助

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


.

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

use yii\db\Expression;

...

$models = Customer::find()
    ->select(['id', 'name', ...])
    ->where(new Expression('id % 2 = 1')])
    ->all();
它绝对比原始sql和
['%2=','id',1]
好,因为它遵循顺序,在我看来更具可读性

['%2=','id',1]
在这里也不合适,因为
%2=
实际上不是像
那样的运算符,例如不在
中,所以运算符、值和
=
符号是混合在一起的

官方文件:


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

哦,Yii将第一个元素视为第二个和第三个之间的运算符。@haoliang官方文件中描述了它。为什么这里需要
开关?@arogachev不需要它,这是一个示例,如果用户不喜欢使用
$conditions
变量,它会使查询更容易阅读。
$conditions
变量实际上很少需要。相反,您可以使用
$query
变量并有条件地添加查询的不同部分。当表达式对象嵌入到SQL语句或片段中时,它将被替换为$Expression属性值
,而无需任何数据库转义或引用。现在,我理解了它的含义。但是object(新表达式)不能是数组中的键。它的工作原理如下:
->where(新表达式('id%2=1'))
通过这种方式,
where(新表达式('id%2=1')
的工作原理与
where('id%2=1')的工作原理相同
.lol.对不起,表达式更适合数组值。是的,所以您可以使用@code>n\647; n\592; n\647; u\592;建议的第一个选项。@haoliang我让samdark确认一下,编写此类条件的正确方法是通过
yii\db\Expression
use yii\db\Expression;

...

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