@vikweb
web-программирование и it-консультации

Как привязывать псевдонимы к таблицам в YII2?

Не могу создать правильный запрос из-за того что не привязывается псевдоним в Yii2.
Имею модель:
class OrdersModel extends \app\components\MyActiveRecord
{
....
    public function getManager()
    {
        return $this->hasOne(UsersModel::className(), ['id' => 'user_id']);
    }
....
}

Суть: надо получить связку с менеджерами из таблицы пользователей (только менеджеры)
Создаю запрос
           $managers=self::find()->joinWith('manager')
                        ->where("manager.role='manager' ")
                        ->groupBy('user_id')
                        ->orderBy('manager.first_name, manager.last_name')
                       ->all();


Получаю следующий запрос с ошибкой:
SELECT `aus_orders`.* FROM `aus_orders` LEFT JOIN `aus_users` ON `aus_orders`.`user_id` = `aus_users`.`id` WHERE manager.role='manager' GROUP BY `user_id` ORDER BY `manager`.`first_name`, `manager`.`last_name`

Явно видно что при сборке запроса псевдонимы исключаются.
Как сделать правильно чтобы получить нормальный запрос с псевдонимом для таблицы?
Чтобы при генерации получалось бы такое:
SELECT `aus_orders`.* ,manager * FROM `aus_orders` AS `manager` LEFT JOIN `aus_users` ON `aus_orders`.`user_id` = `manager`.`id` WHERE manager.role='manager' GROUP BY `user_id` ORDER BY `manager`.`first_name`, `manager`.`last_name`
  • Вопрос задан
  • 366 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Если Вам нужно везде использовать подобный алиас для связи тогда в моделе можно сделать так:
public function getManager()
{
    return $this->hasOne(UsersModel::className(), ['id' => 'user_id'])->alias('manager');
}

Если же Вам только в одном месте нужен алиас, а в остальных нет, можно сделать так:
$managers = self::find()
    ->joinWith([
        'manager' => function($query) {
            $query->alias('manager'); 
        }
    ])
    ->where("manager.role='manager' ")
    ->groupBy('user_id')
    ->orderBy('manager.first_name, manager.last_name')
    ->all();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы