【问题标题】:Yii2 relation with parameterYii2 与参数的关系
【发布时间】:2014-12-26 11:58:36
【问题描述】:

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

情况很简单。我有表 textstexts_regionaltexts_regional 当然有外键 text_idlang_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]);
}

我需要两个表中的数据,所以我想立即加载它。

使用单独的方法并手动构造查询会更好吗?

【问题讨论】:

    标签: activerecord yii2


    【解决方案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();
    

    【讨论】:

      【解决方案2】:
      /**
      * 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();
      

      【讨论】:

        猜你喜欢
        • 2019-02-26
        • 1970-01-01
        • 2015-02-21
        • 2018-10-04
        • 2015-04-03
        • 2016-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多