Question

J'ai un modèle employé qui Appartient un modèle d'adresse. Quand je récupérer les données du modèle employés, l'enregistrement associé d'adresse devient trop tiré par les cheveux. De plus, le modèle d'adresse a une full_name virtualField. Cela ressemble à ceci:

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
                ...

Je veux avoir inclus cette virtualField dans la partie des employés du tableau de données aussi, comme

Array (
[0] => Array (
        [Employee] => Array
            (
                [id] => 1
                [full_name] => Blah Blubb
                ...
            )

Tis n'est pas possible de résoudre en ajoutant simplement

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

au modèle employés, comme le livre de recettes déclare Il y a une solution proposée ( « copier virtualFields d'un modèle à l'autre lors de l'exécution lorsque vous avez besoin d'y accéder »), mais je ne comprends pas cette solution. Où dois-je placer cela? Dans le contrôleur? Dans le modèle de la fonction de recherche?

Merci pour l'aide

Était-ce utile?

La solution 2

Je le fais à la main maintenant dans la fonction de rappel de modèle afterFind:

array_walk($results,function(&$a){
        if(isset($a['Address']['full_name'])) {
            $a['Employee']['full_name'] = $a['Address']['full_name'];
            unset($a['Address']);
        }
    });

Peut-être ce n'est pas agréable, mais cela fonctionne.

Autres conseils

http: // livre. cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632

  

La mise en œuvre de virtualFields en 1.3 a quelques limites.   D'abord, vous ne pouvez pas utiliser virtualFields sur les modèles associés pour   conditions, ordre, ou des tableaux champs. Cela entraînera généralement   une erreur SQL que les champs ne sont pas remplacés par le ORM. C'est   car il est difficile d'estimer la profondeur à laquelle un associé   peut-être trouvé modèle.

Ajoutez ce qui suit à votre modèle:

public function __construct($id=false,$table=null,$ds=null){
    parent::__construct($id,$table,$ds);
    $this->virtualFields = array(
        'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
    );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top