CakePhp: виртуальные поля, содержащие модели данных, связанные с моделью
-
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`)"
);
}