Pregunta

Quiero recibir datos del modelo por find (todos), pero el usuario debe recibir sólo un conjunto restringido de campos de la tabla. Eso es fácil:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

Sin embargo, este modelo (modelo de empleados) también tiene una asociación belongsTo:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

Quiero el campo Address.full_name que aparezca en mi datos obtenidos también. Pero no funciona con la llamada find () anterior, y se genera un error (SQL Error: 1054: Desconocido columna 'Address.full_name' en 'lista de campos') cuando se trata de esto:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

Cualquier persona sabe cómo resolver esto?

EDIT: Me había olvidado por completo que Address.full_name es un campo virtual. En cuanto a la producida SQL-Cakephp, es obvio por qué no lo hace el trabajo:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

En el modelo de dirección, FULL_NAME se define así:

var $virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);

Así pues, la pregunta es: ¿Es un error de CakePHP que no es capaz de incluir campos virtuales (modelo de extranjeros) dentro de un fieldlist suministran de encontrar ()

?
¿Fue útil?

Solución

Por desgracia, no se puede utilizar campos virtuales de la manera que desea. De virtuales Limitaciones de campos virtuales en la documentación de la torta:

  

La implementación de virtualFields en 1.3 tiene algunas limitaciones. En primer lugar no se puede utilizar virtualFields en los modelos asociados a condiciones, el orden o campos matrices. Si lo hace, generalmente dará como resultado un error SQL como los campos no son reemplazados por el ORM. Esto es porque es difícil estimar la profundidad a la que se podría encontrar un modelo asociado.

Parece que tendrá que utilizar el comportamiento Containable.

Otros consejos

Yo usaría el comportamiento Containable en este caso.

Asegúrate de que tienes el comportamiento Containable cargado en su modelo Empleado en primer lugar:

var $actsAs = array('Containable');

Entonces, cuando usted está tratando de obtener sus datos, hacerlo de esta manera:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

Más información sobre el comportamiento controlable aquí: http://book.cakephp.org/view/1323 / Containable

  

Error de SQL: 1054: Desconocido columna   'Address.full_name' en 'lista de campos')

Este error se le da una pista de que algo anda mal, ya sea con su llamada nombre de la columna (no podía ser de fullname en lugar de full_name) o, más probable es que su definición del modelo. Empleado belongsTo una dirección, pero cumple su haveOne Dirección o haveMany empleados?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top