Задать вопрос

Как использовать mysql-функции в ActiveRecord при поиске записи?

Доброго вечера всем.
Ищу пользователя по его уникальному токену. В обычном запросе все выглядит так:
SELECT login FROM `users` WHERE MD5(CONCAT(`users`.`id`,  Yii::app()->params->salt )) = $token

Это работает, но когда я пытаюсь воспользоваться ActiveRecord и CDbCriteria, то получаю ошибку. Делаю по типу:
$criteria=new CDbCriteria;
$criteria->select='login';
$criteria->condition = 'hash=:hash';
$criteria->params = [
      ':hash' => "MD5(CONCAT(`users`.`id`, '" . Yii::app()->params->salt . "'))"
];
$arUser = (new User)->find($criteria);

Но это не работает, т.к. передача в параметры строки с функциями таким образом ожидаемо выдает ошибку о некорректном sql-запросе. Нашел варианты с использованием CDbExpression или findBySql, но это убивает всю красоту работы через AR. Как быть?

Заранее спасибо за советы.
  • Вопрос задан
  • 220 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Akdmeh
@Akdmeh
PHP, Yii2, Music
Увы, придется использовать CDbExpression. Да, совместимость между базами данных убивается, но что поделаешь.
Ответ написан
Комментировать
@bashkarev
Попробуй в модель добавь scope
public function scopes()
    {
        return [
            'hash'=>[
                'condition'=>"hash=MD5(CONCAT(`users`.`id`, '" . Yii::app()->params->salt . "'))"
            ]
        ];
    }

и выбрать User::model()->hash()->find();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы