TortaPHP:campi virtuali contenenti campi dati relativi al modello
-
26-09-2019 - |
Domanda
Ho un modello di dipendente che appartiene a un modello di indirizzo.Quando recupero i dati dal modello Employees, viene recuperato anche il record di indirizzo associato.Inoltre, il modello Indirizzo ha un nome_completo virtualField.Sembra così:
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
...
Voglio includere questo virtualField anche nella parte Employee dell'array di dati, ad esempio
Array (
[0] => Array (
[Employee] => Array
(
[id] => 1
[full_name] => Blah Blubb
...
)
Non è possibile risolverlo semplicemente aggiungendo
$virtualFields = array(
'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);
al modello Employees, come il Cookbook stati Viene proposta una soluzione ("copia virtualFields da un modello a un altro in fase di esecuzione quando è necessario accedervi"), ma non capisco questa soluzione.Dove devo posizionarlo?Nel controllore?Nel modello nella funzione di ricerca?
Grazie per l'aiuto
Soluzione 2
Lo sto facendo manualmente ora nella funzione di callback del modello afterFind:
array_walk($results,function(&$a){
if(isset($a['Address']['full_name'])) {
$a['Employee']['full_name'] = $a['Address']['full_name'];
unset($a['Address']);
}
});
Forse non è carino, ma funziona.
Altri suggerimenti
http://book.cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632
L'implementazione di virtualFields nella versione 1.3 presenta alcune limitazioni.Per prima cosa non è possibile utilizzare VirtualFields su modelli associati per condizioni, ordini o array di campi.Ciò comporterà generalmente un errore SQL poiché i campi non vengono sostituiti dall'ORM.Questo perché è difficile stimare la profondità alla quale si potrebbe trovare un modello associato.
Aggiungi quanto segue al tuo modello:
public function __construct($id=false,$table=null,$ds=null){
parent::__construct($id,$table,$ds);
$this->virtualFields = array(
'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
);
}