Добрый день.
Нужна языковая поддержка на сайт (Чтобы имена объектов выводились на языке пользователя, который хранится в сессии
['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 '%Волг%')?
Или я изначально по неправильному пути пошёл? Нигде не могу найти примера именно вот с такой хитрой связью. В основном один-к-одному или один-ко-многим.
Буду благодарен за помощь!