首页 文章

Yii2与参数的关系

提问于
浏览
2

是否有可能以及在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 回答

  • 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();
    

    要么

    $news = TextRegional::find()->byType(2)->visible()->all();
    
  • 4
    /**
    * 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();
    

相关问题