usdglander
@usdglander
Yipee-ki-yay

Поясните, как сделать правильный relation в Yii2?

Добрый день.
Нужна языковая поддержка на сайт (Чтобы имена объектов выводились на языке пользователя, который хранится в сессии ['eng', 'rus']). Сделал такую архитектуру БД:

Таблица city:
id |name      |description
1  |Москва    |Описание Москвы
2  |Волгоград |Описание Волгограда

Таблица lang:
id |entity  |entity_id |lang |param        |value
1  |city    |1         |rus  |name         |Москва
2  |city    |1         |eng  |name         |Moscow
3  |city    |2         |rus  |name         |Волгоград
4  |city    |2         |eng  |name         |Volgograd
5  |city    |1         |rus  |description  |Описание Москвы
6  |city    |1         |eng  |description  |About Moscow
...

Далее прописал в модели City соответствующую связь:
public function getName()
{
    return $this->hasOne(Lang::className(), ['entity_id' => 'id'])
                ->where(['lang' => $this->getLang(), 'param' => 'name', 'entity' => 'city']);
}
//$this->getLang() - просто возвращает из сессии значение языка

Пытаюсь организовать поиск города по полю name со значением текущего языка:
City::find()->joinWith('name')->where([ 'like', 'name', 'Волг' ]);
//Формирует запрос: SELECT `city`.* FROM `city` LEFT JOIN `lang` ON `city`.`id` = `lang`.`entity_id` WHERE (`name` LIKE '%Волг%') AND ((`lang`='rus') AND (`param`='name') AND (`entity`='city'))

Как мне заставить формировать модельку запрос вида:
SELECT `city`.* FROM `city` LEFT JOIN `lang` ON `city`.`id` = `lang`.`entity_id` WHERE (`value` LIKE '%Волг%') AND ((`lang`='rus') AND (`param`='name') AND (`entity`='city'))

(`value` LIKE '%Волг%') вместо (`name` LIKE '%Волг%')?
Или я изначально по неправильному пути пошёл? Нигде не могу найти примера именно вот с такой хитрой связью. В основном один-к-одному или один-ко-многим.
Буду благодарен за помощь!
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Пригласить эксперта
Ваш ответ на вопрос

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

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