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();