是否有可能以及在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]);
}
我需要来自两个表的数据,所以我想加载它。
使用单独的方法并手动构建查询是否更好?
答案 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();