Плейсхолдеры в activeQuery

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Плейсхолдеры в activeQuery

Сообщение Nerf »

Привет! Подскажите, как подцепить данные в запросе:

Код: Выделить всё

public function actionSearchAjax($term, $current = null) {
    $data = [];

    if(is_string($term) && strlen($term) >= 3) {
        $result = Concert::find()->select(['id', 'title'])->where(['like', 'title', ':term'])
            ->andFilterWhere(['!=', 'id', ':current'])->params([':term' => $term, ':current' => $current])
            ->asArray()->all();
        if(count($result)) $data = $result;
    } 

    return Json::encode($data);
}
При вызове возникает ошибка:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
.
Что я делаю не так?
ram0973
Сообщения: 54
Зарегистрирован: 2010.06.12, 22:18
Откуда: Набережные Челны
Контактная информация:

Re: Плейсхолдеры в activeQuery

Сообщение ram0973 »

http://www.yiiframework.com/doc-2.0/yii ... e()-detail
Note that unlike where(), you cannot pass binding parameters to this method.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Плейсхолдеры в activeQuery

Сообщение Nerf »

С filterWhere и andFilterWhere понятно, но то же самое происходит и с такими вариантами:

Код: Выделить всё

$result = Concert::find()->select(['id', 'title'])->where(['like', 'title', ':term'])
    ->andWhere(['!=', 'id', ':current'])->params([':term' => $term, ':current' => $current])->asArray()->all();
    
$result = Concert::find()->select(['id', 'title'])->where(['like', 'title', ':term'])
    ->params([':term' => $term])->asArray()->all();
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Плейсхолдеры в activeQuery

Сообщение zelenin »

Код: Выделить всё

->where(['like', 'title', ':term'])
если вы пишите в такой нотации, то третьим параметром тут подразумевается raw-значение, которое АВТОМАТИЧЕСКИ биндится. То есть тут должно быть так:

Код: Выделить всё

->where(['like', 'title', $term])
а если вы пишите строкой:

Код: Выделить всё

->where('title like :term') 
то тут нужно ВРУЧНУЮ добавлять биндинги через addParams(..)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Плейсхолдеры в activeQuery

Сообщение Nerf »

Спасибо.
Ответить