有多种方法可以解决这个问题,这里是其中的三种:
使用回调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]);
结合虚拟属性
您还可以在此处使用(重新)使用虚拟属性,例如在您的实体类full_name中定义的属性名称:User
protected function _getFullName()
{
return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
您可以在格式化程序中返回它,而不是再次手动组合这两个字段:
function($row) {
return $row['full_name'];
}
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]);
也可以看看
覆盖列表查找器
如果您希望始终应用您的自定义列表,您可以覆盖表类list中的查找器。Users
use Cake\ORM\Query;
// ...
public function findList(Query $query, array $options)
{
return $query
->find()
->select(['id', 'first_name', 'last_name'])
// etc ...
;
}
这样就可以继续使用了find('list')。
也可以看看