2010-09-30 4 views
4

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

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 (
[0] => Array (
     [Employee] => Array 
      (
       [id] => 1 
       [full_name] => Blah Blubb 
       ... 
      ) 

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

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

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

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

ответ

2

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

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

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

+0

Что происходит, когда Адрес ['full_name'] не установлен? Там много ситуаций, когда вы не можете рассчитывать на связанные с ними данные, такие как поиск («список») или поиск, исходящий из связанной модели. Любой код, зависящий от нахождения правильного $ a ['Employee'] ['full_name'], не выполняется. Причина, по которой я спрашиваю, заключается в том, что я сталкиваюсь с той же ситуацией. –

1

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

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

К сожалению, это не сработало для меня, и я обнаружил, что для этого мне нужно использовать совершенно другой подход. Внутри контроллера Employee теперь я использую сдерживаемое поведение для извлечения адресных данных, а затем мне нужно вручную прокрутить записи и вставить поле full_name в часть «Employee» массива записей. Это может быть уродливым, но оно работает. – joni

4

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

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

Смежные вопросы