Подтвердить что ты не робот

Список поиска 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')));

Я не могу использовать фильтры моделей и обратный вызов. Пожалуйста, предложите мне, как я могу это сделать в самих контроллерах.

4b9b3361

Ответ 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')));

Он возвращает имя с комбинированными полями

Ответ 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);