Daw*_*jee 11 cakephp find key-value cakephp-3.0 dropdown
我需要帮助使用find或get或其他任何东西在键值对中获取两个值(用于人类友好下拉列表).我需要帮助最简单的方法在CakePHP中执行此操作.
这是我的尝试:
在我的控制器中
$users = $this->LocationsUser->Users->find('list', [
'limit' => 1,
'keyField' => 'id',
'valueField' => ['first_name', 'last_name']
])->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)在我看来
echo $this->Form->input('user_id', [
'options' => $users,
'type' => 'select',
'multiple' => false,
]);
Run Code Online (Sandbox Code Playgroud)我下拉列表的结果:
<option value="10">Fabian;Pankiers</option>
Run Code Online (Sandbox Code Playgroud)看到我需要一个没有分号的结果";" .现在我可以使用javascript删除分号,但那就太过分了.在CakePHP 3中有没有一种简单的方法可以实现这一点?
ndm*_*ndm 25
有多种方法可以解决这个问题,其中有三种方法:
valueField使用回调并使用结果中的值将值拼接在一起.
$query = $this->LocationsUser->Users
->find('list', [
'valueField' => function ($row) {
return $row['first_name'] . ' ' . $row['last_name'];
}
])
->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)
也可以看看
使用将值组合在一起的结果格式化程序,这也就是list取景器在内部执行的操作,与上面的示例基本相同,只是更复杂.
$query = $this->LocationsUser->Users
->find()
->select(['id', 'first_name', 'last_name'])
->formatResults(function($results) {
/* @var $results \Cake\Datasource\ResultSetInterface|\Cake\Collection\CollectionInterface */
return $results->combine(
'id',
function($row) {
return $row['first_name'] . ' ' . $row['last_name'];
}
);
})
->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)
您还可以在此处使用(重新)使用虚拟属性,例如,full_name在您的User实体类中定义的属性名称:
protected function _getFullName()
{
return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
Run Code Online (Sandbox Code Playgroud)
您可以在格式化程序中返回它,而不是再次手动组合这两个字段:
function($row) {
return $row['full_name'];
}
Run Code Online (Sandbox Code Playgroud)
在valueField示例中也可以这样做.
也可以看看
添加计算字段并将其用于该valueField选项
$query = $this->LocationsUser->Users
->find('list', [
'keyField' => 'id',
'valueField' => 'concatenated'
]);
$query
->select([
'id',
'concatenated' => $query->func()->concat([
'first_name' => 'literal',
' ',
'last_name' => 'literal'
])
])
->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)
也可以看看
如果您希望始终应用自定义列表,则可以覆盖表类中的list查找程序Users.
use Cake\ORM\Query;
// ...
public function findList(Query $query, array $options)
{
return $query
->find()
->select(['id', 'first_name', 'last_name'])
// etc ...
;
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以继续使用了find('list').
也可以看看
简单快速的解决方案,像魅力一样工作(CakePHP 3.2.6):
$users = $this->LocationsUser->Users->find('list', [
'limit' => 1,
'keyField' => 'id',
'valueField' => function ($e) {
return $e->get('first_name'). ' ' . $e->get('last_name');
}
])->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)