Использование виртуальных полей в cakePHP 2.икс

Я прочитал документацию и изо всех сил пытался понять, что делать. Кроме того, я прочитал вопросы здесь, в 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

что я должен изменить? Я вижу, что он строит запрос, но он меняет его ужасно плохо...

может кто-нибудь помочь?

2 ответов


в нижней части документа cake указаны некоторые ограничения виртуальных полей..

реализация 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, ")")'
);

и в моей пользовательской модели, я сменил его на этот:

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'];
}

и, наконец, в моем UsersController я просто немного изменил его:

$hrEmployees = $this->User->HrEmployee->find('list',
    array(
        'fields' => array("id","fullname"),
        'order' => array('HrEmployee.name ASC','HrEmployee.surname ASC')
));