2014-12-26 4 views
2

Yii2에서 매개 변수와의 관계를 정의하는 것이 가장 좋은 방법일까요?Yii2와 매개 변수의 관계

상황은 간단합니다. 나는 테이블 과 texts_regional이 있습니다. texts_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]); 
} 

내가 두 테이블의 데이터가 그래서 열망 하중이 싶습니다해야합니다.

별도의 메서드를 사용하고 쿼리를 수동으로 생성하는 것이 더 좋습니까?

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는 메인 컨트롤러에 설정됩니다 : - 그것은 할 가능성이 문서에

답변

4

읽기> onCondition 그래서 이런 방법을 썼다.

는하지만 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();