如何写Yii2中的查询与整数作为第二个参数

时间:2018-05-31 12:31:46

标签: postgresql yii2

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

SELECT * 
FROM some_table 
WHERE 1492257600 BETWEEN start AND end

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

$results = static::find()->where(['between', 1492257600, 'start', 'end'])
                ->all();

这是我得到的错误:

Undefined column: 7 ERROR:  column \"1492257600\" does not exist
The SQL being executed was: SELECT * FROM \"some_table\" WHERE \"1492257600\" BETWEEN 'start' AND 'end'"

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

有人能告诉我如何正确地写出它们之间的位置吗?

3 个答案:

答案 0 :(得分:4)

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

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慢,如果您的桌子可能会变大并且使用率指标至关重要,我建议您进行一些性能测试。

答案 1 :(得分:0)

我没有使用postgresql的经验,但这将与之间的工作相同,

$results = self::find()
   ->where(['>=', 'start', 1492257600])
   ->andWhere(['<=', 'end', 1492257600])
   ->all();

答案 2 :(得分:0)

请参阅:Yii2 Doc

当一个Expression对象嵌入在一个SQL语句或片段中时,它将被$expression属性值替换,而不会有任何DB转义或引用。

所以你会有这样的事情:

$expression = new \yii\db\Expression('1492257600 BETWEEN start AND end');
$results = self::find()->where($expression)
            ->all();