Yii2 DropDownList,全名

时间:2015-01-27 15:48:13

标签: yii2

我正在尝试使用此人的全名填写Yii2中的下拉列表,第一个和最后一个名称在我的数据库的不同列中。

在我的人员表中

  • ID
  • 如first_name
  • 姓氏
  • dep_id(fk)

...

在我的Person.php模型中我有

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

这是我的帮助函数,可以在GridViews中获取全名并且工作正常。但是我在填充下拉列表时遇到了麻烦。

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

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

表示我在下拉列表中没有任何内容,但人员ID是正确的。那么我怎么能正确地解决这个问题呢?

2 个答案:

答案 0 :(得分:5)

您不能使用ArrayHelper::map(),因为fullName未在模型属性中显示。

但是您可以指定闭包而不是属性名称来实现所需的结果:

$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()方法将被调用()。如果您检查official documentation该方法,您会发现一些将$key指定为闭包的示例。

通常这样的列表反之亦然:字符串变量由ids索引。

在这种情况下,您可以将其作为$items传递,以显示drop-down list

在您的情况下,当模型集包含至少两个具有完全相同名称的人时,可能会出现一些问题。

要改变它,只需简单地切换第二个和第三个参数。

答案 1 :(得分: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