これを解決するにはさまざまな方法がありますが、ここではそのうちの 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]);
仮想プロパティと組み合わせる
たとえば、エンティティ クラスfull_nameで定義されたプロパティ名を指定すると、ここで仮想プロパティを (再) 使用することもできます。User
protected function _getFullName()
{
return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
2 つのフィールドを手動で再度結合する代わりに、フォーマッタでそれを返すことができます。
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')。
こちらもご覧ください