Yii2与参数的关系

时间:2014-12-26 11:58:36

标签: activerecord yii2

是否有可能以及在Yii2中使用参数定义关系的最佳方式。

情况很简单。我有表文本 texts_regional 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]);
}

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

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

2 个答案:

答案 0 :(得分:4)

在文档中读取可以做的事情 - > 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();

或者

$news = TextRegional::find()->byType(2)->visible()->all();

答案 1 :(得分:1)

/**
* relation with current LangContractTemplate
*/
public function getCurLangContractTemplate()
{
    if(isset(Yii::$app->user->identity->u_lang) && !empty(Yii::$app->user->identity->u_lang))
        $langId = Yii::$app->user->identity->u_lang;
    else
        $langId = \Yii::$app->language;

        return $this->hasOne(LangContractTemplate::className(), ['lcont_cont_id' => 'cont_id'])->onCondition(['lcont_lang_id' => $langId]);
}

//------------------OR------------------

/**
 * relation with language table
 */
public function getContractByLang()
{
    return $this->hasOne(LangContractTemplate::className(), ['lcont_cont_id' => 'cont_id']);
}

/* and Get data  */
$contract_content = ContractTemplate::find()
->joinWith(['contractByLang' => function($query) use ($lang) {
    return $query->where(['lcont_lang_id' => $lang]);
}])
->one();