我正在尝试使用此人的全名填写Yii2中的下拉列表,第一个和最后一个名称在我的数据库的不同列中。
在我的人员表中
...
在我的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是正确的。那么我怎么能正确地解决这个问题呢?
答案 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