CakePHP найти список - PullRequest
       4

CakePHP найти список

13 голосов
/ 24 сентября 2010

Привет! Я хочу создать список, используя find, чтобы я мог использовать его в select helper.но есть проблема.Я тоже хочу получить идентификатор, имя (первый + последний).так как я могу этого достичь.Я хочу, чтобы имя и фамилия были объединены как имя.Как мне этого добиться.

$this->User->find('all',array('fields' => array('first_name','last_name','id')));

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

Ответы [ 5 ]

24 голосов
/ 24 сентября 2010

Я думаю, что это можно сделать, используя свойства 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';

Идентификатор выбирается автоматически.

16 голосов
/ 25 сентября 2010

Другое решение состоит в том, чтобы использовать Cake Set :: объединить, чтобы создать то, что вам нужно ...

$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

1 голос
/ 23 декабря 2013

Для этого сначала перейдите к модели и добавьте эту строку

  public $virtualFields = array('full_name' => 'CONCAT(first_name, " ", last_name)');

, а затем перейдите к файлу контроллера, просто используйте имя "full_name", которое вы вводите в виртуальные поля

$this->User->find('all',array('fields' => array('full_name','id')));

Возвращает имя с объединенными полями

0 голосов
/ 08 декабря 2015

В моем случае Set :: объединение было подходящим способом, поскольку мне приходилось сталкиваться с конкатенацией полей в связанных моделях, например:

$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);
0 голосов
/ 25 сентября 2010

+ 1 в ответе Тима, однако, если вам нужна альтернатива, teknoid давно написал хорошую статью об этом:

http://nuts -and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...