是否有可能以及在 Yii2 中定义与参数的关系的最佳方法是什么?
情况很简单。我有表格文本和texts_regional。texts_regional当然有外键text_id和lang_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)
我需要来自两个表的数据,所以我想急切地加载它。
使用单独的方法并手动构建查询是否更好?
阅读文档,可以这样做 ->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)
| 归档时间: |
|
| 查看次数: |
7420 次 |
| 最近记录: |