Как написать где Между запросом в Yii2 с целым числом в качестве второго параметра - PullRequest
0 голосов
/ 31 мая 2018

У меня есть этот запрос в PostgreSQL, который я хочу реализовать в моей модели в Yii2:

SELECT * 
FROM some_table 
WHERE 1492257600 BETWEEN start AND end

start и end являются атрибутами some_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 голосов
/ 31 мая 2018

См. Это: Yii2 Doc

Когда объект Expression внедрен в оператор или фрагмент SQL, он будет заменен значением свойства $expression без выхода из БД илицитирование.

поэтому у вас будет что-то вроде этого:

$expression = new \yii\db\Expression('1492257600 BETWEEN start AND end');
$results = self::find()->where($expression)
            ->all();
0 голосов
/ 31 мая 2018

Для таких случаев есть выделенное выражение 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, я предлагаю провести некоторый тест производительности, если ваша таблица может вырасти и индексы использования имеют решающее значение.

0 голосов
/ 31 мая 2018

У меня нет опыта работы с postgresql, но это будет работать так же, как и между

$results = self::find()
   ->where(['>=', 'start', 1492257600])
   ->andWhere(['<=', 'end', 1492257600])
   ->all();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...