Добрый день. Занимаюсь интернационализацией сайта на Yii2. Пытаюсь сделать запрос для получения сущности с переводом. Имею следующую структуру таблиц:
В модели
Sale прописал связь:
public function getTranslate()
{
return $this->hasMany(SaleI18n::className(), ['sale_id' => 'id']);
}
В
SaleQuery прописал следующее:
Второе условие сделал для того, чтобы в случае, если перевода для данной записи нет, то ничего бы не возвращалось.
public function withTranslate($lang = null)
{
if (!$lang)
{
$lang = Yii::$app->language;
}
return $this->joinWith('translate')
->andOnCondition([
'and',
[
'SaleI18n.lang' => $lang
],
[
'!=', 'SaleI18n.id', null
]
]);
}
После чего я попытался получить некоторую запись:
Sale::find()->withTranslate('en')->where(['alias' => 'becomePartner', 'active' => 1]);
В ответ получаю пустой результат. При этом генерируется следующий SQL-запрос:
SELECT `Sale`.* FROM `Sale` LEFT JOIN `SaleI18n` ON `Sale`.`id` = `SaleI18n`.`sale_id` WHERE ((`alias`='becomePartner') AND (`active`=1)) AND ((`SaleI18n`.`lang`='en') AND (`SaleI18n`.`id` != NULL))
Заметил, что, если из выполнить запрос непосредственно в базе, убрав при этом
AND (`SaleI18n`.`id` != NULL)
и изменив
SELECT `Sale`.*
на просто
SELECT *
,
то я получаю нужную мне запись с переводом.
Удаление второго условия в
withTranslate() не дает никакого эффекта. Замена
andOnCondition на
andWhere вообще убирает прописанные мной условия из запроса.
Мне кажется, что я запутался в простейших вещах. Пожалуйста подскажите, как сделать функцию для получения перевода из связной таблицы, чтобы в случае отсутствия перевода весь запрос ничего не возвращал. И как потом оперировать этими данными? Спасибо!