首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用integer作为第二个参数在Yii2中编写where Between查询

如何使用integer作为第二个参数在Yii2中编写where Between查询
EN

Stack Overflow用户
提问于 2018-05-31 20:31:46
回答 3查看 736关注 0票数 1

我在PostgreSQL中有这个查询,我想在我的Yii2模型中实现它:

代码语言:javascript
复制
SELECT * 
FROM some_table 
WHERE 1492257600 BETWEEN start AND end

startendsome_table的属性。在我的模型中,我尝试了以下方法,但无论我如何编写,它都会抛出相同的错误。

代码语言:javascript
复制
$results = static::find()->where(['between', 1492257600, 'start', 'end'])
                ->all();

这是我得到的错误:

未定义的列:7错误:列\"1492257600\“不存在正在执行的SQL是: SELECT * FROM \"some_table\”WHERE \"1492257600\“介于'start‘和’end‘之间”

在构建查询时,这些符号" "将被添加到整数中,因此PostgreSQL认为它是表的一列。

谁能告诉我怎么写正确的中间位置?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-31 23:41:52

对于这种情况,有专门的BetweenColumnsCondition表达式:

代码语言:javascript
复制
use yii\db\conditions\BetweenColumnsCondition;

$results = static::find()
    ->where(new BetweenColumnsCondition(1492257600, 'BETWEEN', 'start', 'end'))
    ->all();

它会自动引用列名并转义值,因此它应该比简单的yii\db\Expression更方便。

还要注意,WHERE 1492257600 BETWEEN start AND end可能比WHERE 1492257600 >= start AND 1492257600 <= end慢,如果您的表可能变得更大,并且使用索引至关重要,我建议您做一些性能测试。

票数 5
EN

Stack Overflow用户

发布于 2018-05-31 20:53:45

我没有使用postgresql的经验,但这将在两者之间工作,

代码语言:javascript
复制
$results = self::find()
   ->where(['>=', 'start', 1492257600])
   ->andWhere(['<=', 'end', 1492257600])
   ->all();
票数 0
EN

Stack Overflow用户

发布于 2018-05-31 20:59:22

请参考:Yii2 Doc

当表达式对象嵌入到SQL语句或片段中时,它将被替换为$expression属性值,而没有任何DB转义或引号。

所以你会得到类似这样的东西:

代码语言:javascript
复制
$expression = new \yii\db\Expression('1492257600 BETWEEN start AND end');
$results = self::find()->where($expression)
            ->all();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50624411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档