Esto realmente suena como un trabajo para Set::combine()
. Su campo de visualización no debe hacer referencia a un modelo diferente, porque no siempre está garantizado que se unirá. Por lo tanto, si una llamada en algún lugar no ingresara los datos, arrojaría un error.
En su lugar, usando Set::combine()
puede crear una matriz de clave-valor con lo que desee. Si bien esto es menos "mágico", dará lugar a menos posibilidades de errores.
Para un ejemplo de UsersController, digamos que tiene hasOne Profile y desea que el usuario seleccione un usuario usando un menú desplegable auto-poblado (es decir, usando FormHelper) que muestre los nombres completos del usuario de su perfil. Usaremos Containable para traer los datos del perfil.
class AppModel extends Model {
$actsAs = array(
'Containable'
);
}
Luego, en 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');
}
Se dará cuenta de que full_name
está ahora en el Modelo de perfil, ya que utiliza los campos de ese modelo. El método de combinar crea una matriz como
array(
1 => 'skerit',
2 => 'jeremy harris'
);
cual se utilizará automáticamente cuando se utiliza el FormHelper para crear una lista desplegable
echo $this->Form->input('user_id');
Gracias, esto me ayudó a entender combinar(). No olvides que vas a necesitar agregar contenido en tu ejemplo. – 472084
Genial, me alegro de que ayudó a alguien. Agregué contenido al ejemplo para hacer la respuesta más completa. – jeremyharris