2015-01-27 2 views
2

Yii2의 드롭 다운 목록에 사람의 성명을 채우려고합니다. 성 및 이름이 다른 DB의 다른 열에 있습니다. 내 사람이 테이블에Yii2 전체 이름을 사용하는 DropDownList

  • ID
  • FIRST_NAME
  • LAST_NAME
  • DEP_ID (FK) 내 Person.php 모델에서

...

를 I have

public function getFullName() 
{ 
    return $this->first_name . ' ' . $this->last_name; 
} 

이것은 GridView에서 전체 이름을 얻고 잘 작동하는 도우미 함수입니다. 하지만 드롭 다운에 문제가 있습니다.

// Get person 
    $person = Person::find() 
       ->orderBy('last_name') 
       ->asArray() 
       ->all(); 

    // Person drop down 
    $personMap = ArrayHelper::map($person, 'fullName', 'dep_id'); 

드롭 다운 목록에는 아무 것도 표시되지 않지만 사람 ID는 정확합니다. 그러면 내가 어떻게 이것에 대해 제대로 갈 필요가 있을까요?

답변

5

fullName이 모델 속성에 표시되어 있지 않으므로 ArrayHelper::map()을 사용할 수 없습니다.

하지만 당신이 원하는 결과를 얻기 위해 대신 속성 이름의 폐쇄를 지정할 수 있습니다

$person = Person::find() 
    ->orderBy('last_name')    
    ->all(); 

$personMap = ArrayHelper::map(
    $person, 
    function ($person, $defaultValue) { 
     return $person->getFullName(); 
    } 
    'dep_id' 
); 

당신이 asArray()을 적용하면, 당신은 모델 메소드를 호출 할 수 없습니다,하지만 당신은 여전히 ​​같은 이름을 포함 할 수 있습니다 그래서 :

$person = Person::find() 
    ->orderBy('last_name')    
    ->asArray() 
    ->all(); 

$personMap = ArrayHelper::map(
    $person, 
    function ($person, $defaultValue) { 
     return $person['first_name'] . ' ' . $person['last_name']; 
    } 
    'dep_id' 
); 

전체 이름을 얻는 논리가 중복되어 있으므로 사용하지 않는 것이 좋습니다. 자세한 사항에 관해서는

: getValue() 메소드가 호출됩니다 모두 $from$to 매개 변수에 대한 map() 방법(). 그리고 해당 메소드에 대해 official documentation을 확인하면 $key을 클로저로 지정하는 몇 가지 예가 있습니다.

또한 대개 이러한 목록은 id가 색인화 된 문자열 변수로 구성됩니다.

이 경우 $items으로 표시하여 drop-down list으로 표시 할 수 있습니다.

그리고 귀하의 경우에는 모델 세트에 이름이 동일한 두 명 이상의 사람이있을 때 몇 가지 문제가있을 수 있습니다.

그냥 두 번째와 세 번째 매개 변수를 변경하면됩니다.

2
//use yii\helpers\ArrayHelper; 


//use app\models\Users; 


//replace lastname with field you want to order by in your database table 

$person = Users::find() 

->orderBy('LastName')    

->all(); 

$personMap = ArrayHelper::map(

    $person,'UserID', 


    function ($person, $defaultValue) 

     { 
     return $person->getFullName(); 
     } 

     ); 

     ?> 
//replace UserID 

    <?= $form->field($model, 'UserID')->dropDownList(
$personMap, ['prompt'=>'[--select person--]', 
     ]) 
?> 

//get getFullname function should placed in your model 

function getFullName() 
{ 
    return $this->FirstName."".$this->LastName; 
    } 
//Firstname and lastname are the fields in your database 
관련 문제