2012-06-18 9 views
6

Ho un modello che non contiene titoli di sorta. Tutte le informazioni interessanti sono in un modello correlato.Utilizzare un campo da un modello correlato come campo di visualizzazione in CakePHP

ho già letto di virtualfields, con cui è possibile combinare i campi in questo modo:

public $virtualFields = array("full_name"=>"CONCAT(event_id, ' ' ,begin)"); 
public $displayField = 'full_name'; 

ma che mi dà con un semplice id e una data. Ho bisogno di quell'id per essere il nome dell'altro modello.

risposta

6

Questo sembra davvero un lavoro per Set::combine(). Il tuo campo di visualizzazione non dovrebbe fare riferimento a un modello diverso, perché non è sempre garantito il collegamento. Pertanto, se una chiamata da qualche parte non portava i dati, generava un errore.

Invece, utilizzando Set::combine() è possibile creare un array di valori-chiave con qualsiasi cosa si desideri. Mentre questo è meno "magico", si tradurrà in meno possibilità di errori.

Per un esempio di UserController, supponiamo di avere hasOne Profile e desideri che l'utente selezioni un utente utilizzando un menu a discesa compilato automaticamente (ovvero, utilizzando FormHelper) che mostra i nomi completi dell'utente dal loro profilo. Useremo Containable per inserire i dati del profilo.

class AppModel extends Model { 
    $actsAs = array(
    'Containable' 
); 
} 

Poi nel UsersController:

function choose($id = null) { 
    // regular view code here 
    $users = $this->User->find('all', array(
    'contain' => array(
     'Profile' 
    ) 
)); 
    // create a key-value that the FormHelper recognizes 
    $users = Set::combine($users , '{n}.User.id', '{n}.Profile.full_name'); 
} 

Si noterà che full_name è ora sul modello di profilo, in quanto utilizza i campi da quel modello. Il metodo di combinare crea una matrice come

array(
    1 => 'skerit', 
    2 => 'jeremy harris' 
); 

che verrà automaticamente utilizzato quando si utilizza il FormHelper per creare un elenco a discesa

echo $this->Form->input('user_id'); 
+1

Grazie, questo mi ha aiutato a capire combinare(). Non dimenticare che dovrai aggiungere contenibili nel tuo esempio. – 472084

+0

Cool, felice che abbia aiutato qualcuno. Ho aggiunto contenibile all'esempio per rendere la risposta più completa. – jeremyharris

Problemi correlati