You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:48