Yii2带全名的下拉列表

Yii2带全名的下拉列表,yii2,Yii2,我试图在Yii2中填充一个下拉列表,其中包含此人的全名,名字和姓氏在我的数据库中的不同列中 在我个人的桌子上 身份证 名字 姓 副局长(fk) 在我的Person.php模型中 public function getFullName() { return $this->first_name . ' ' . $this->last_name; } 这是我的助手函数,用于在GridView中获取全名,工作正常。但是我在填充下拉列表时遇到了问题 // Get per

我试图在Yii2中填充一个下拉列表,其中包含此人的全名,名字和姓氏在我的数据库中的不同列中

在我个人的桌子上

  • 身份证
  • 名字
  • 副局长(fk)

在我的Person.php模型中

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是正确的。那么,我需要如何正确地执行此操作呢?

您不能像那样使用
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'
);
我不建议使用它,因为它重复了获取全名的逻辑

至于细节:在
map()
中,将调用
$from
$to
参数的
getValue()
方法()。如果您检查该方法,您将发现一些将
$key
指定为闭包的示例

通常这样的列表也是由ID索引的字符串变量组成的,反之亦然

在这种情况下,您可以将其作为
$items
传递以进行显示

在您的例子中,当模型集至少包含两个名字完全相同的人时,可能会出现一些问题

若要更改,只需切换第二个和第三个参数。

//使用yii\helpers\ArrayHelper;
//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
//使用app\models\Users; //将lastname替换为数据库表中要排序的字段 $person=Users::find() ->orderBy('LastName') ->全部(); $personMap=ArrayHelper::map( $person,'UserID', 函数($person$defaultValue) { 返回$person->getFullName(); } ); ?> //替换用户ID //get getFullname函数应该放在模型中 函数getFullName() { 返回$this->FirstName。“$this->LastName; } //Firstname和lastname是数据库中的字段