2014-12-26 38 views
2

是否有可能以及在Yii2中定義與參數的關係的最佳方式是什麼?Yii2與參數的關係

情況很簡單。我有表文本texts_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]); 
} 

我需要從兩個表中的數據,所以我想急於負荷這一點。

使用單獨的方法並手動構建查詢只是更好嗎?

回答

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模型並加入文本模型設置條件。 發了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
/** 
* 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();