Yii2 DropDownList 全名

标签 yii2

我正在尝试用此人的全名填充 Yii2 中的下拉列表,名字和姓氏在我的数据库中的不同列中。

在我的个人表中

  • 编号
  • 名字
  • 姓氏
  • dep_id (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() 因为 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 指定为闭包的示例。

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

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

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

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

关于Yii2 DropDownList 全名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174440/

相关文章:

yii2 - 使用composer创建yii2项目出错

session - 尽管 session 超时设置为至少 1 天,但 Yii2 session 在用户空闲固定秒数后就会过期

php - GridView 中相关模型的过滤器设置

Yii2模态高度问题

installation - Composer 安装错误:ZipArchive::extractTo():完整提取路径超过 MAXPATHLEN (260)

php - Yii2 - 基于 dropDownList 显示表单字段

php - 在 Kartik Gridview 数据列中自动换行

php - 有没有办法使 Yii2 查询缓存记录无效/变脏?

Yii2:如何使用 facebook、twitter、google 和linkedin 实现社交登录

php - 如何在 Yii2 搜索模型中使用数组进行搜索