CakePHP: campos virtuales que contienen campos de datos relacionados con el modelo
-
26-09-2019 - |
Pregunta
Tengo un modelo de empleado, que Pertenece a una dirección-modelo. Cuando voy a buscar los datos del modelo de los empleados, el registro de direcciones asociado obtiene exagerado demasiado. Además, el modelo de direcciones tiene un FULL_NAME virtualField. Esto se parece a esto:
Array
(
[0] => Array
(
[Employee] => Array
(
[id] => 1
[address_id] => 33
[username] => ...
...
)
[Address] => Array
(
[id] => 33
[firstname] => Blah
[full_name] => Blah Blubb
...
)
)
[1] => Array (
[Employee] => Array (
[id] => 2
...
Quiero han incluido esta virtualField en la parte de los empleados de la matriz de datos también, como
Array (
[0] => Array (
[Employee] => Array
(
[id] => 1
[full_name] => Blah Blubb
...
)
Tis no es posible resolver con sólo añadir
$virtualFields = array(
'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);
para el modelo de los empleados, ya que el libro de cocina afirma Existe una propuesta de solución ( "copiar virtualFields de un modelo a otro en tiempo de ejecución cuando se necesita para acceder a ellos"), pero no entiendo esta solución. ¿Dónde tengo que poner esto? En el controlador? En el modelo de la función de búsqueda?
Gracias por la Ayuda
Solución 2
Estoy haciendo esto a mano ahora en la función de devolución de llamada afterFind modelo:
array_walk($results,function(&$a){
if(isset($a['Address']['full_name'])) {
$a['Employee']['full_name'] = $a['Address']['full_name'];
unset($a['Address']);
}
});
Puede ser que no es agradable, pero funciona.
Otros consejos
http: // libro. cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632
La implementación de virtualFields en 1.3 tiene algunas limitaciones. En primer lugar no se puede utilizar en los modelos virtualFields asociados para condiciones, orden, o campos matrices. Si lo hace, generalmente dará como resultado error de un SQL como los campos no se sustituyen por el ORM. Esto es porque es difícil estimar la profundidad a la que un asociado modelo podría ser encontrado.
añadir lo siguiente a su modelo:
public function __construct($id=false,$table=null,$ds=null){
parent::__construct($id,$table,$ds);
$this->virtualFields = array(
'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
);
}