Yii2 与参数的关系

pra*_*xus 2 activerecord yii2

是否有可能以及在 Yii2 中定义与参数的关系的最佳方法是什么?

情况很简单。我有表格文本texts_regionaltexts_regional当然有外键text_idlang_id

Gii 生成了一种获取所有区域文本的方法,但我在前端不需要它。我只需要使用当前的语言。生成方法为:

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

试过了,但可能不对:

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]);
}
Run Code Online (Sandbox Code Playgroud)

我需要来自两个表的数据,所以我想急切地加载它。

使用单独的方法并手动构建查询是否更好?

pra*_*xus 5

阅读文档,可以这样做 ->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]);
}
Run Code Online (Sandbox Code Playgroud)

$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;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

$ft = TextRegional::find()->byCode("footer_text")->one();
Run Code Online (Sandbox Code Playgroud)

或者

$news = TextRegional::find()->byType(2)->visible()->all();
Run Code Online (Sandbox Code Playgroud)