Список поиска cakephp
Привет, я хочу, чтобы иметь возможность генерировать список, используя find, чтобы я мог использовать в select helper. но есть проблема. Я хочу слишком fetch id, name (first + last). так как я могу это достичь. Я хочу, чтобы имя first_name и last_name соединялись как имя. Как я могу это достичь.
$this->User->find('all',array('fields' => array('first_name','last_name','id')));
Я не могу использовать фильтры моделей и обратный вызов. Пожалуйста, предложите мне, как я могу это сделать в самих контроллерах.
Ответы
Ответ 1
Я думаю, что это можно сделать с помощью virtualFields
и displayField
в вашей модели.
В вашей модели определите виртуальное поле для полного имени следующим образом:
public $virtualFields = array(
'full_name' => 'CONCAT(User.first_name, " ", User.last_name)'
);
Если вы теперь установите displayField на full_name, вы сможете получить список ваших пользователей с помощью $this->User->find('list')
который вы можете использовать без проблем с помощником по формам.
public $displayField = 'full_name';
... или же:
public $displayField = 'User.full_name';
Идентификатор выбирается автоматически.
Ответ 2
Другим решением является использование Cake Set:: comb для сборки того, что вам нужно...
$users = $this->User->find('all',array('fields' => array('first_name','last_name','id')));
$user_list = Set::combine($users, '{n}.User.id', array('{0} {1}', '{n}.User.first_name', '{n}.User.last_name'));
Результат будет выглядеть примерно так:
array(
[2] => 'First Last',
[5] => 'Bob Jones'
)
Здесь ссылка на документацию:
http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine
Ответ 3
Для этого сначала перейдите к модели и добавьте эту строку
public $virtualFields = array('full_name' => 'CONCAT(first_name, " ", last_name)');
а затем перейдите к файлу контроллера, просто используйте имя "full_name", которое вы поместили в виртуальные поля
$this->User->find('all',array('fields' => array('full_name','id')));
Он возвращает имя с комбинированными полями
Ответ 4
+1 на ответ Тима, однако, если вам нужна альтернатива, teknoid написал хорошую статью об этом давным-давно:
http://nuts-and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/
Ответ 5
$result = $this- > modelName- > find ('list', array ('fields' = > array ('modelName.IstField', 'modelName.IIndField', 'modelName.IIIrdField')));
Ответ 6
В моем случае Set:: comb был способом перехода, поскольку мне приходилось иметь дело с конкатенацией полей в связанных моделях, например:
$bancos_enteros = $this->Financiacion->Banco->find('all', array(
'fields' => array('Empresa.codigo_contable','Empresa.nombre_corto', 'Banco.id'),
'order' => array('Empresa.codigo_contable' => 'asc'),
'recursive' => 1
));
$bancos = Set::combine(
$bancos_enteros,
'{n}.Banco.id',
array(
'{0} {1}',
'{n}.Empresa.codigo_contable',
'{n}.Empresa.nombre_corto'
)
);
возвращение
array(
(int) 14 => '57200002 Caixa',
(int) 15 => '57200003 Sabadell',
(int) 3 => '57200005 BBVA',
(int) 16 => '57200006 Deutsche Bank',
(int) 17 => '57200007 Popular',
(int) 18 => '57200009 March',
(int) 26 => '57200010 Bankinter',
(int) 4 => '57200011 Santander'
)
В то время как
$this->Financiacion->Banco->Empresa->virtualFields = array(
'codigo_nombre' => 'CONCAT(Empresa.codigo_contable,Empresa.nombre_corto)'
);
$this->Financiacion->Banco->virtualFields['codigo_nombre'] = $this->Financiacion->Banco->Empresa->virtualFields['codigo_nombre'];
$bancos = $this->Financiacion->Banco->find('list', array(
'fields' => array('Banco.id','Banco.codigo_nombre'),
'order' => array('Banco.codigo_nombre' => 'asc'),
'recursive' => 1
)
);
возвращает ошибку SQL в следующем запросе, если я сначала не удаляю виртуальные поля:
unset($this->Financiacion->Banco->Empresa->virtualFields);
unset($this->Financiacion->Banco->virtualFields);