2010-09-24 6 views
12

Привет, Я хочу, чтобы иметь возможность генерировать список, используя find, чтобы я мог использовать в select helper. но есть проблема. Я хочу слишком fetch id, name (first + last). так как я могу это достичь. Я хочу, чтобы имя first_name и last_name соединялись как имя. Как я могу это достичь.cakephp список поиска

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

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

+0

Связанные для CakePHP 2.X: http://stackoverflow.com/q/35594552/1369473 – Fr0zenFyr

ответ

23

Я думаю, что это можно сделать с помощью virtualFields и displayField var в вашей модели.

В модели, определить виртуальное поле для полного имени, как это:

var $virtualFields = array(
    'full_name' => 'CONCAT(User.first_name, " ", User.last_name)' 
); 

Если теперь установить displayField в full_name вы должны быть в состоянии получить список пользователей с $ this-> User-> find ('list'), который можно использовать без проблем с помощью Form-helper.

var $displayField = 'full_name'; 

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

+0

, где Должен ли я указать, какое поле => array() будет выбрано ??? –

16

Другим решением является использование 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

+0

спасибо, сделал работу отлично – aWebDeveloper

+1

virtualFields, как сказано ниже, так оно и должно быть сделано. держит этот контроллер тощим. – dogmatic69

+2

VirtualFields необязательно может быть решением. Вопрос в том, хотите ли вы изменить структуру возвращаемых данных во всем мире, чтобы разместить один контроллер/действие? Если нет, использование Set :: comb, вероятно, является лучшим решением. Если вам нужно full_name глобально, добавьте виртуальное поле. – Dooltaz

0

$ результат = $ this-> modelName-> найти ('список', массив ('поля' => array ('modelName.IstField', 'modelName.IIndField', 'modelName.IIIrdField ')));

1

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

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

, а затем перейти к файлу контроллера просто использовать имя «FULL_NAME», который вы кладете в виртуальных полях

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

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

+0

ОК, чтобы присвоить 'full_name'' $ displayField' и выполнить 'find ('list')', хотя ваше решение также дает тот же результат. – Fr0zenFyr

0

В моем случае 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); 
Смежные вопросы