Ответ 1
Существуют различные способы решения этой проблемы, здесь три из них:
Используйте обратный вызов для 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
.
См. также
- Поваренная книгa > Доступ к базе данных и ORM > Конструктор запросов > Запросы представляют собой объекты коллекции
- Cookbook > Доступ к базе данных и ORM > Query Builder > Добавление расчетных полей
- Cookbook > Доступ к базе данных и ORM > Сущности > Создание виртуальных свойств
Вычисляемые поля
Добавьте вычисленное поле и используйте его для опции 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]);
См. также
Переопределить поиск списка
Если вы хотите, чтобы ваш пользовательский список всегда применялся, вы можете переопределить finder 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')
.
См. также