Question

Je veux recevoir des données du modèle par trouver (tous), mais l'utilisateur doit seulement obtenir un ensemble restreint de champs de table. C'est facile:

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

Mais ce modèle (modèle employés) a également une association belongsTo:

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

Je veux que le champ Address.full_name apparaisse dans mes données extraites aussi. Mais il ne remet fonctionne pas avec la découverte () ci-dessus, et il renvoie une erreur (erreur SQL: 1054: Unknown column « Address.full_name » dans 'liste des champs) lorsque vous essayez ceci:

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

Tout le monde sait comment résoudre ce problème?

EDIT: Je suis totalement oublié que Address.full_name est un champ virtuel. En regardant le SQL CakePHP produit, il est évident pourquoi il ne fonctionne pas:

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

Dans le modèle d'adresse, full_name est définie comme ceci:

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

Alors, la question est: Est-ce un bug de CakePHP que ce n'est pas en mesure d'inclure (modèle de l'étranger) champs virtuels dans un fieldList fourni à trouver ()

?
Était-ce utile?

La solution

Malheureusement, vous ne pouvez pas utiliser des champs virtuels comme vous le souhaitez. De Limitations des champs virtuels dans la documentation du gâteau:

  

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 à des conditions, l'ordre ou des tableaux de champs. Cela se traduira généralement par une erreur SQL que les champs ne sont pas remplacés par le ORM. En effet, il est difficile d'estimer la profondeur à laquelle pourrait se trouver un modèle associé.

Il semble que vous devrez utiliser le comportement maîtrisable.

Autres conseils

J'utiliser le comportement maîtrisable dans ce cas.

Assurez-vous que vous avez le comportement maîtrisable chargé dans votre modèle employé d'abord:

var $actsAs = array('Containable');

Alors, quand vous essayez d'obtenir vos données, faites comme ceci:

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

En savoir plus sur le comportement maîtrisable ici: http://book.cakephp.org/view/1323 / maîtrisable

  

Erreur SQL: 1054: Unknown column   'Address.full_name' dans 'liste des champs')

Cette erreur vous donne un indice que quelque chose ne tourne pas rond soit votre appel nom de la colonne (pourrait-il être fullname plutôt que full_name) ou, plus votre définition du modèle. Employé Appartient une adresse, mais ne l'adresse haveOne ou haveMany employés?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top