2012-06-18 8 views
6

Tengo un modelo que no contiene títulos de ningún tipo. Toda la información interesante está en un modelo relacionado.Utilice un campo de un modelo relacionado como campo de visualización en CakePHP

yo ya leí sobre virtualfields, con el que se pueden combinar los campos de la siguiente manera:

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

Pero eso me da con una identificación sencilla y una fecha. Necesito esa identificación para ser el nombre del otro modelo.

Respuesta

6

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'); 
+1

Gracias, esto me ayudó a entender combinar(). No olvides que vas a necesitar agregar contenido en tu ejemplo. – 472084

+0

Genial, me alegro de que ayudó a alguien. Agregué contenido al ejemplo para hacer la respuesta más completa. – jeremyharris

Cuestiones relacionadas