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

È stato utile?

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`)"
    );
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top