Yii2 DropDownList,全名

Jon*_*nny 2 yii2

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

在我的人员表中

  • ID
  • 名字
  • dep_id(fk)

...

在我的Person.php模型中,我有

public function getFullName()
{
    return $this->first_name . ' ' . $this->last_name;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    // Person drop down
    $personMap = ArrayHelper::map($person, 'fullName', 'dep_id'); 
Run Code Online (Sandbox Code Playgroud)

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

aro*_*hev 5

你不能这样使用ArrayHelper::map(),因为fullName它没有出现在模型属性中.

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

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

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

如果您申请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'
);
Run Code Online (Sandbox Code Playgroud)

我不建议使用它,因为它是重复获取全名的逻辑.

至于细节:在map()方法$from$to参数getValue()方法中都会调用().如果您查看该方法的官方文档,您会发现一些指定$key为闭包的示例.

通常也会形成这样的列表,反之亦然:由ids索引的字符串变量.

在这种情况下,您可以将其传递$items给显示下拉列表.

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

要改变它只需切换第二个和第三个参数.