Связь Yii2 с параметром

Возможно ли и как лучше всего определить отношение с параметром в Yii2.

Ситуация проста. У меня есть таблица тексты и тексты_региональные. texts_regional, конечно же, имеет внешние ключи text_id и lang_id.

Gii сгенерировал метод для получения всех региональных текстов, но мне это не нужно во внешнем интерфейсе. Мне просто нужно на текущем языке. Сгенерированный метод:

public function getTextsRegionals()
{
    return $this->hasMany(TextRegional::className(), ['text_id' => 'id']);
}

Пробовал это, но это, вероятно, не правильно:

public function getReg($langId=null)
{
    if($langId === null && Yii::$app->session->has('langId')) {
        $langId = Yii::$app->session->get('langId');
    }
    return $this->hasOne(TextRegional::className(), ['text_id' => 'id', 'lang_id'=>$langId]);
}

Мне нужны данные из обеих таблиц, поэтому я хотел бы загрузить это.

Не лучше ли использовать отдельный метод и вручную построить запрос?


person praxus    schedule 26.12.2014    source источник


Ответы (1)


Прочтите в документации, что можно сделать ->onCondition, поэтому написал такой метод:

public function getReg($langId=1)
{
    if(Yii::$app->session->has('langId')) {
        $langId = Yii::$app->session->get('langId');
    }

    return $this->hasOne(TextRegional::className(), ['text_id' => 'id'])->onCondition(['lang_id' => $langId]);
}

$langId устанавливается в главном контроллере.

Но в итоге я использовал модель TextRegional и присоединился к модели Text, чтобы установить условие. Создал класс TextRegionalQuery и добавил новый метод:

public function byCode($code)
{
    if(Yii::$app->session->has('langId')) {
        $langId = Yii::$app->session->get('langId');
    } else {
        $langId = 1;
    }

    $this->joinWith('text0')
        ->andWhere("lang_id = '".$langId."'")
        ->andWhere("texts.code = '".$code."'");

    return $this;
}

Используя его следующим образом:

$ft = TextRegional::find()->byCode("footer_text")->one();

Or

$news = TextRegional::find()->byType(2)->visible()->all();
person praxus    schedule 26.12.2014