2011-03-07 2 views
5

다음 양식을 사용하여 Yii에 관련 테이블의 데이터 목록을 드롭 다운 형식으로 가져옵니다.관계를 사용하여 dropDownList를 정렬 했습니까?

dropDownList(CHtml::listData(Company::model()->findAll(array('order' => 'company ASC')))); 

이 방법이 효과적이지만 모든 드롭 다운 목록에는) 저는이 모든 것을 array('order' => 'company ASC'에 넣을 것입니다.

이것을 수행하는 가장 좋은 방법입니까? 모델 관계()를 사용하여이 데이터를 얻고 관계 내에서 순서를 지정하는 방법이 없습니까?

답변

5

올바른 방법은 scopes을 사용하는 것입니다.

당신은 결과 세트를 주문 범위의 수를 정의과 같이 사용할 수 있습니다 :

Company::model()->scopeName()->findAll(); 

항상가 정렬 된 순서로 꺼낼 수있는 회사를 필요로 응용 프로그램, 당신은도를 정의 할 수 있습니다 모델 클래스의 범위를 기본 :이 Company::model()->findAll(); 반환 분류 결과를 호출 할 때마다 발생합니다

public function defaultScope() { 
    return array('order' => 'company ASC'); 
} 

.

+0

아, 그게 바로 내가 찾는 것. 감사! – djt

+0

하지만 데이터베이스에 보내려는 것은 아마도 회사 ID가 아니라 회사 이름 (드롭 다운 목록에 표시 될 것입니다)입니다. 어떻게 처리합니까? –

1

나는 보통 드롭 다운의 소스로 사용할 수있는 각 모델에 opts() 방법을 추가 : 당신이 동일한 옵션을 여러 번해야하는 경우

class Company extends CActiveRecord 
{ 
    // ... 

    public static opts() 
    { 
     $opts = array(); 
     foreach(self::model()->findAll(array('order'=>'name ASC')) as $model) 
      $opts[$model->id] = $model->name; 
     return $opts; 
    } 

그것은이

echo $form->dropDownList($user, 'company_id', Company::opts()); 

처럼 사용되는 페이지를 사용하면 개인 정적 클래스 변수에 결과를 "캐싱"하거나 DAO를 사용하여보다 효율적인 방법으로 목록 데이터를 가져올 수 있습니다.

관련 문제