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');
Grazie, questo mi ha aiutato a capire combinare(). Non dimenticare che dovrai aggiungere contenibili nel tuo esempio. – 472084
Cool, felice che abbia aiutato qualcuno. Ho aggiunto contenibile all'esempio per rendere la risposta più completa. – jeremyharris