2010-09-24 9 views
12

Hola, quiero ser capaz de generar una lista usando find para que pueda usarlo en select helper. pero hay un problema. también quiero buscar ID, nombre (primero + último). Entonces, ¿cómo puedo lograrlo? Quiero first_name y last_name para unirme como nombre. Cómo puedo lograrlo.cakephp find list

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

No puedo usar filtros de modelos y devolución de llamada Por favor sugiérame cómo puedo hacerlo en los controladores mismos.

+0

relacionado para CakePHP 2.X: http://stackoverflow.com/q/35594552/1369473 – Fr0zenFyr

Respuesta

23

Creo que esto se puede hacer usando los campos virtualFields y displayField var en su modelo.

En su modelo, definir un campo virtual para el nombre completo de esta manera:

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

Si ahora configurar displayField a FULL_NAME usted debe ser capaz de obtener una lista de los usuarios con los $ this-> Método User-> find ('list') que puedes utilizar sin problemas con el Form-helper.

var $displayField = 'full_name'; 

La identificación se obtiene automáticamente.

+0

donde ¿Debo especificar qué campo => matriz() para seleccionar? –

16

Otra solución es utilizar Conjunto de Cake :: combinan para crear lo que necesita ...

$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')); 

El resultado será algo como:

array(
[2] => 'First Last', 
[5] => 'Bob Jones' 
) 

Aquí está el enlace de documentación:

http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine

+0

gracias hizo el trabajo perfectamente – aWebDeveloper

+1

virtualFields como se indica a continuación es la forma en que se debe hacer. mantiene ese controlador delgado. – dogmatic69

+2

VirtualFields puede no ser necesariamente la solución. La pregunta es, ¿desea cambiar la estructura de los datos devueltos globalmente para acomodar un controlador/acción? Si no, usar Set :: combine es probablemente una mejor solución. Si necesita full_name globalmente, agregue el campo virtual. – Dooltaz

0

$ resultado = $ this-> modelName-> find ('list', array ('campos' => array ('modelName.IstField', 'modelName.IIndField', 'modelName.IIIrdField ')));

1

Para lograr este primer ir al modelo y añadir esta línea

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

y luego ir al archivo de controlador sólo tiene que utilizar el nombre "FULL_NAME", que se pone en los campos virtuales

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

Se devuelve el nombre con los campos combinados

+0

Está bien asignar 'full_name' a' $ displayField' y hacer un 'find ('list')', aunque, su solución también da el mismo resultado. – Fr0zenFyr

0

En mi caso, Set :: combine era el camino a seguir, ya que tuve que lidiar con la concatenación de campos en modelos asociados, como:

$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' 
    ) 
); 

regresar

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' 
) 

Mientras

$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 
    ) 
); 

devuelve un error de SQL en una consulta siguiente si no eliminar los campos virtuales en primer lugar:

unset($this->Financiacion->Banco->Empresa->virtualFields); 
unset($this->Financiacion->Banco->virtualFields);