Frage

Ich mag Modelldaten von find (alle) empfangen, aber der Benutzer muss nur einen eingeschränkten Satz von Tabellenfeldern erhalten. Das ist ganz einfach:

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

Aber dieses Modell (Mitarbeiter-Modell) hat auch einen belongsTo Verein:

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

Ich mag das Address.full_name Feld auch in meinen abgerufenen Daten angezeigt werden. Aber es funktioniert nicht mit dem find () Aufruf oben, und es wirft einen Fehler (SQL-Fehler: 1054: Unknown column 'Address.full_name' in 'field list') bei dem Versuch, diese:

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

Wer weiß, wie diese zu lösen?

EDIT: ich total vergessen, dass Address.full_name ein virtuelles Feld ist. Mit Blick auf die CakePHP produzierten SQL, es ist offensichtlich, warum es nicht funktioniert:

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

Im Adress Modell wird full_name wie folgt definiert:

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

Also, die Frage ist: Ist es ein CakePHP Fehler, dass es nicht in der Lage ist, schließen (Fremdmodell) virtuelle Felder innerhalb einer Feldliste geliefert zu finden ()

?
War es hilfreich?

Lösung

Leider kann man nicht virtuell verwenden, um Felder, wie Sie wünschen. Aus Einschränkungen für virtuelle Felder in der Kuchen Dokumentation:

  

Die Umsetzung der virtualFields in 1.3 hat einige Einschränkungen. Zuerst kann man nicht virtualFields auf zugehörigen Modelle für Bedingungen, Ordnung oder Felder Arrays verwenden. Dadurch wird in einem SQL-Fehler im Allgemeinen zur Folge, da die Felder nicht durch die ORM ersetzt werden. Dies liegt daran, es schwierig, die Tiefe, in der ein zugehöriges Modell zur Abschätzung gefunden werden könnte.

Es sieht aus wie Sie das Contain Verhalten verwenden müssen werden.

Andere Tipps

würde ich das Contain Verhalten in diesem Fall verwendet werden.

Stellen Sie sicher, dass das Contain Verhalten haben in Ihrem Mitarbeitermodell geladen zuerst:

var $actsAs = array('Containable');

Dann, wenn Sie versuchen, Ihre Daten zu erhalten, tun Sie es wie folgt aus:

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

Mehr über das contain Verhalten hier: http://book.cakephp.org/view/1323 / Contain

  

SQL-Fehler: 1054: Unbekannte Spalte   'Address.full_name' in 'Feldliste')

Dieser Fehler gibt Ihnen einen Anhaltspunkt, dass etwas nicht stimmt entweder mit dem Spaltennamen Anruf (könnte es fullname anstatt full_name) oder, wahrscheinlicher, Ihre Modelldefinition. Mitarbeiter belongsTo eine Adresse, aber funktioniert die Adresse haveOne oder haveMany Mitarbeiter?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top