Как исправить запрос с Yii2 в postgresql?

330
31 августа 2017, 21:28

Всем привет.

Хочу сделать запрос:

$res = Clients::find()
        ->alias('cl')
        ->select(['cl.*','token.meta_key','token.meta_val'])
        ->innerJoin(ClientsTokens::tableName().' as token','token.client_id=cl.id')
        ->where('cl.active=1 AND cl.service_id@>{'.$serviceID.'} AND token.meta_key=\'token\' AND token.meta_val NOT LIKE \'\' AND token.service_id=:service_id',[':service_id'=>$serviceID])
        ->each()
        ->next();

Мне выдается сообщение:

Exception 'yii\db\Exception' with message 'SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "{"
LINE 1: ...ent_id=cl.id WHERE cl.active=1 AND cl.service_id@>{2} AND to...
                                                             ^
The SQL being executed was: SELECT "cl".*, "token"."meta_key", "token"."meta_val" FROM "clients" "cl" INNER JOIN "clients_tokens" "token" ON token.client_id=cl.id WHERE cl.active=1 AND cl.service_id@>{2} AND token.meta_key='token' AND token.meta_val NOT LIKE '' AND token.service_id=2'
in /Users/km/work/service.dev/vendor/yiisoft/yii2/db/Schema.php:636
Error Info:
Array
(
    [0] => 42601
    [1] => 7
    [2] => ERROR:  syntax error at or near "{"
LINE 1: ...ent_id=cl.id WHERE cl.active=1 AND cl.service_id@>{2} AND to...
                                                             ^
)

Как поправить?

Answer 1
$res = Clients::find()
    ->alias('cl')
    ->select(['cl.*','token.meta_key','token.meta_val'])
    ->innerJoin(ClientsTokens::tableName().' as token','token.client_id=cl.id')
    ->where('cl.active=1 AND cl.service_id@>\'{'.$serviceID.'}\' AND token.meta_key=\'token\' AND token.meta_val NOT LIKE \'\' AND token.service_id=:service_id',[':service_id'=>$serviceID])
    ->each();
foreach($res as $re) { 
    var_dump($re);
}

Нужно json взять в ковычки, тогда валидатор yii считает, что это строка и не пытается провалидировать.