CakePhp: виртуальные поля, содержащие модели данных, связанные с моделью

StackOverflow https://stackoverflow.com/questions/3831872

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня есть модель сотрудника, который принадлежит адресной модели. Когда я получу данные от модели сотрудников, связанная с ними адресной записи тоже получается. Кроме того, адресная модель имеет Virtualfield Full_name. Это выглядит так:

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

Я хочу включить это Virtualfield в состав сотрудника в части Array данных, как

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

TIS невозможно решить, просто добавляя

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

для модели сотрудников, как поваренная книга состояния Существует предложенный решение («Скопируйте виртуальные поля из одной модели к другой во время выполнения, когда вам нужно получить доступ к ним»), но я не понимаю этого решения. Где мне это сделать? В контроллере? В модели в нахождении функции?

Спасибо за помощь

Это было полезно?

Решение 2

Я делаю это вручную сейчас в функции обратного вызова модели последования:

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

Может быть, это не приятно, но это работает.

Другие советы

http://book.cakephp.org/view/1608/virtual-fields#virtual-fields-and-model-Aliases-1632.

Реализация виртуальных полей в 1.3 имеет несколько ограничений. Сначала вы не можете использовать Virtualfields в соответствующих моделях для условий, заказа или массивов полей. Это, как правило, приведет к ошибке SQL, поскольку поля не заменяются на ORM. Это потому, что трудно оценить глубину, на которой можно найти связанную модель.

Добавьте следующее в свою модель:

public function __construct($id=false,$table=null,$ds=null){
    parent::__construct($id,$table,$ds);
    $this->virtualFields = array(
        'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
    );
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top