2010-09-24 15 views
12

Ciao Voglio essere in grado di generare una lista usando find in modo che io possa usare in select helper. ma c'è un problema. voglio anche recuperare id, nome (prima + ultima). quindi come posso ottenerlo. Voglio che first_name e last_name vengano uniti come nome. Come posso ottenerlo.cakephp find list

Non riesco a utilizzare i filtri di modello e la richiamata Per favore suggeriscimi come posso farlo nei controller stessi.

+0

correlati per CakePHP 2.X: http://stackoverflow.com/q/35594552/1369473 – Fr0zenFyr

risposta

23

Penso che questo può essere fatto utilizzando i campi virtuali e visualizza Campo variabile nel modello.

nel modello, definire un campo virtuale per il nome completo come questo:

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

Se ora si imposta displayField a FULL_NAME si dovrebbe essere in grado di ottenere un elenco di utenti con il $ this-> User-> find ('list') metodo che puoi usare senza problemi con Form-helper.

var $displayField = 'full_name'; 

L'ID viene recuperato automaticamente.

+0

dove dovrei specificare quale campo => array() deve essere selezionato ??? –

16

Un'altra soluzione è quella di utilizzare il set di Cake :: combinano per costruire quello che ti serve ...

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

Risultato avrà un aspetto simile:

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

Ecco il link documentazione:

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

+0

grazie ha fatto perfettamente il lavoro – aWebDeveloper

+1

campi virtuali come detto di seguito è il modo in cui dovrebbe essere fatto. mantiene quel controller magro. – dogmatic69

+2

VirtualFields potrebbe non essere necessariamente la soluzione. La domanda è, vuoi cambiare la struttura dei dati restituiti a livello globale per ospitare un controller/azione? In caso contrario, utilizzare Set :: combine è probabilmente una soluzione migliore. Se hai bisogno di full_name a livello globale, aggiungi il campo virtuale. – Dooltaz

0

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

1

per raggiungere questo obiettivo prima andare al modello e aggiungere questa linea

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

e poi vai a file di controllo basta usare il nome "FULL_NAME", che si mette in campi virtuali

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

E ' restituisce il nome con i campi combinati

+0

È OK assegnare "full_name' a' $ displayField' e fare un 'find ('list')', sebbene la soluzione fornisca lo stesso output. – Fr0zenFyr

0

Nel mio caso, Set :: combine era la strada da percorrere, dal momento che dovevo affrontare la concatenazione di campi nei modelli associati, ad esempio:

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

ritorno

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

Mentre

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

restituisce un errore di SQL in una query seguente se non eliminare i campi virtuali prima:

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