如何在 CakePHP 3 中通过 combining/having 两个字段创建键值对(显示字段)?
How do I create a keyValue pair (display field) by combining/having two fields in CakePHP 3?
我需要帮助使用 find 或 [=28= 在键值对中获取两个值(用于人类友好的下拉菜单) ]get 或其他任何东西。我需要有关在 CakePHP 中执行此操作的最简单方法的帮助。
这是我的尝试:
在我的控制器中
$users = $this->LocationsUser->Users->find('list', [
'limit' => 1,
'keyField' => 'id',
'valueField' => ['first_name', 'last_name']
])->where(['id' => $id]);
在我看来
echo $this->Form->input('user_id', [
'options' => $users,
'type' => 'select',
'multiple' => false,
]);
我下拉的结果:
<option value="10">Fabian;Pankiers</option>
看到我需要一个没有分号的结果 ";"。现在我可以使用 javascript 删除分号,但那太过分了。有没有在 CakePHP 3 中实现此目的的简单方法?
有多种方法可以解决这个问题,这里是其中的三个:
为 valueField
使用回调
使用回调并使用结果中的值将值拼接在一起。
$query = $this->LocationsUser->Users
->find('list', [
'valueField' => function ($row) {
return $row['first_name'] . ' ' . $row['last_name'];
}
])
->where(['id' => $id]);
另见
结果格式化程序
使用结果格式化程序将值拼接在一起,这也是 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]);
结合虚拟属性
您也可以在这里使用(重新)使用虚拟属性,例如在您的 User
实体 class 中定义的 属性 名称 full_name
:
protected function _getFullName()
{
return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
您可以 return 在格式化程序中,而不是再次手动组合两个字段:
function($row) {
return $row['full_name'];
}
在 valueField
示例中也可以这样做。
另见
- Cookbook > Database Access & ORM > Query Builder > Queries Are Collection Objects
- Cookbook > Database Access & ORM > Query Builder > Adding Calculated Fields
- Cookbook > Database Access & ORM > Entities > Creating Virtual Properties
计算字段
添加一个计算字段并将该字段用于 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]);
另见
覆盖列表查找器
如果您希望始终应用您的自定义列表,您可以覆盖 Users
table class.
中的 list
查找器
use Cake\ORM\Query;
// ...
public function findList(Query $query, array $options)
{
return $query
->find()
->select(['id', 'first_name', 'last_name'])
// etc ...
;
}
这样你就可以继续使用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]);
我需要帮助使用 find 或 [=28= 在键值对中获取两个值(用于人类友好的下拉菜单) ]get 或其他任何东西。我需要有关在 CakePHP 中执行此操作的最简单方法的帮助。
这是我的尝试:
在我的控制器中
$users = $this->LocationsUser->Users->find('list', [ 'limit' => 1, 'keyField' => 'id', 'valueField' => ['first_name', 'last_name'] ])->where(['id' => $id]);
在我看来
echo $this->Form->input('user_id', [ 'options' => $users, 'type' => 'select', 'multiple' => false, ]);
我下拉的结果:
<option value="10">Fabian;Pankiers</option>
看到我需要一个没有分号的结果 ";"。现在我可以使用 javascript 删除分号,但那太过分了。有没有在 CakePHP 3 中实现此目的的简单方法?
有多种方法可以解决这个问题,这里是其中的三个:
为 valueField
使用回调
使用回调并使用结果中的值将值拼接在一起。
$query = $this->LocationsUser->Users
->find('list', [
'valueField' => function ($row) {
return $row['first_name'] . ' ' . $row['last_name'];
}
])
->where(['id' => $id]);
另见
结果格式化程序
使用结果格式化程序将值拼接在一起,这也是 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]);
结合虚拟属性
您也可以在这里使用(重新)使用虚拟属性,例如在您的 User
实体 class 中定义的 属性 名称 full_name
:
protected function _getFullName()
{
return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
您可以 return 在格式化程序中,而不是再次手动组合两个字段:
function($row) {
return $row['full_name'];
}
在 valueField
示例中也可以这样做。
另见
- Cookbook > Database Access & ORM > Query Builder > Queries Are Collection Objects
- Cookbook > Database Access & ORM > Query Builder > Adding Calculated Fields
- Cookbook > Database Access & ORM > Entities > Creating Virtual Properties
计算字段
添加一个计算字段并将该字段用于 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]);
另见
覆盖列表查找器
如果您希望始终应用您的自定义列表,您可以覆盖 Users
table class.
list
查找器
use Cake\ORM\Query;
// ...
public function findList(Query $query, array $options)
{
return $query
->find()
->select(['id', 'first_name', 'last_name'])
// etc ...
;
}
这样你就可以继续使用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]);