Я прочитал документацию и изо всех сил пытался понять, что делать. Кроме того, я прочитал вопросы здесь о stackoverflow, и ничего, что я пытался, помогло.
У меня есть раскрывающийся список, который я хочу перечислить всем сотрудникам компании. Список должен отображаться следующим образом:
Name Surname (Job Title)
В моей модели у меня есть эта часть кода:
public $virtualFields = array( 'fullname' => 'CONCAT(HrEmployee.name, " ", HrEmployee.surname, " (", HrEmployee.jobTitle, ")")' );
И в моем контроллере у меня есть это:
$hrEmployees = $this->User->HrEmployee->find('fullname', array( 'fields' => array('HrEmployee.name','HrEmployee.surname','HrEmployee.jobTitle'), 'order' => array('HrEmployee.name'=>'ASC','HrEmployee.surname'=>'ASC') ));
Но я получаю эту ошибку:
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `User__fullname` FROM `intraweb_db`.`users` AS `User` WHERE `User`.`hr_emp' at line 1
Что я должен изменить? Я вижу, что он строит запрос, но он меняет его ужасно плохо …
Может ли кто-нибудь помочь?
В нижней части документа торта указаны некоторые ограничения виртуальных полей.
Реализация virtualFields имеет несколько ограничений. Сначала вы не можете использовать virtualFields для связанных моделей для условий, порядка или массивов полей. Это приведет к ошибке SQL, поскольку поля не заменяются ORM. Это связано с тем, что трудно оценить глубину, на которой может быть найдена соответствующая модель.
http://book.cakephp.org/2.0/en/models/virtual-fields.html#limitations-of-virtualfields
Круто, поэтому я его исправил. Частично спасибо Брэндону за то, что он указал мне в правильном направлении.
Из-за ограничения виртуальных полей мне пришлось сделать обходной путь.
Итак, в моей модели HrEmployee я сделал это:
public $virtualFields = array( 'fullname' => 'CONCAT(HrEmployee.name, " ", HrEmployee.surname, " (", HrEmployee.jobTitle, ")")' );
И в моей модели User я изменил ее на это:
class User extends AppModel { public function __construct($id = false, $table = null, $ds = null) { parent::__construct($id, $table, $ds); $this->virtualFields['fullname'] = $this->HrEmployee->virtualFields['fullname']; }
И, наконец, в моем UserController я немного изменил его:
$hrEmployees = $this->User->HrEmployee->find('list', array( 'fields' => array("id","fullname"), 'order' => array('HrEmployee.name ASC','HrEmployee.surname ASC') ));