CakePHP: виртуальные поля, содержащие поля данных, связанных с моделью - PullRequest
4 голосов
/ 30 сентября 2010

У меня есть модель Employee, которая принадлежит к Address-модели.Когда я извлекаю данные из модели Employees, соответствующая запись адреса также извлекается.Кроме того, модель Address имеет полное имя virtualField.Это выглядит так:

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 в часть данных массива Employee, например,

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

http://book.cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632

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

2 голосов
/ 25 октября 2010

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

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

Может быть, это нехорошо, но работает.

1 голос
/ 30 сентября 2010

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

public function __construct($id=false,$table=null,$ds=null){
    parent::__construct($id,$table,$ds);
    $this->virtualFields = array(
        'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
    );
}
...