Как правильно составить запрос ActiveQuery в Yii2?

Добрый день. Занимаюсь интернационализацией сайта на Yii2. Пытаюсь сделать запрос для получения сущности с переводом. Имею следующую структуру таблиц:
602d5185d2197761239193.png
В модели 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 вообще убирает прописанные мной условия из запроса.

Мне кажется, что я запутался в простейших вещах. Пожалуйста подскажите, как сделать функцию для получения перевода из связной таблицы, чтобы в случае отсутствия перевода весь запрос ничего не возвращал. И как потом оперировать этими данными? Спасибо!
  • Вопрос задан
  • 125 просмотров
Пригласить эксперта
Ответы на вопрос 1
toratoda
@toratoda
Sale::find()->withTranslate('en')->where(['alias' => 'becomePartner', 'active' => 1]);


вы не забыли в конце ->one() либо ->all()?
Ответ написан
Ваш ответ на вопрос

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

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