如何在Yii2中正确编写以整数为中间值的BETWEEN查询
解决Yii2中PostgreSQL反向BETWEEN查询的问题
你遇到的问题是因为Yii2查询构建器的between条件默认语法是列在中间,值在两侧,而你的需求是反过来——把固定值放在BETWEEN的中间,用列作为范围边界,所以默认的写法会把整数误识别为列名。
下面是几种正确的实现方式:
方法1:使用参数绑定的字符串条件
这种方式直接写SQL片段,同时通过参数绑定避免SQL注入,适合简单场景:
$timestamp = 1492257600; $results = static::find() ->where(':timestamp BETWEEN start AND end', [':timestamp' => $timestamp]) ->all();
方法2:使用Expression对象(推荐)
如果需要更灵活的表达式,或者要和其他查询条件组合,使用yii\db\Expression是更规范的做法:
use yii\db\Expression; $timestamp = 1492257600; $results = static::find() ->where(new Expression(':value BETWEEN start AND end', [':value' => $timestamp])) ->all();
方法3:拆解为两个比较条件
你也可以把BETWEEN逻辑拆成start <= 值和end >= 值的组合,用Yii2的数组条件语法实现:
$timestamp = 1492257600; $results = static::find() ->where(['<=', 'start', $timestamp]) ->andWhere(['>=', 'end', $timestamp]) ->all();
为什么原写法会报错?
原代码['between', 1492257600, 'start', 'end']遵循的是Yii2默认的between格式:['between', '列名', 值1, 值2],所以框架会把1492257600当成列名处理,自动给它加上引号,最终生成的SQL就变成了WHERE "1492257600" BETWEEN 'start' AND 'end',这显然不符合你的需求。
内容的提问来源于stack exchange,提问作者ymiraola
相关产品推荐
相关产品推荐

