我有一个模型Employee属于Address-model。当我从Employees模型中获取数据时,也会获取关联的地址记录。此外,Address模型具有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也包含在数据数组的Employee部分中,例如
Array (
[0] => Array (
[Employee] => Array
(
[id] => 1
[full_name] => Blah Blubb
...
)
只需添加
即可解决问题$virtualFields = array(
'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);
到Employees模型,作为Cookbook states 提出了一个解决方案(“当你需要访问它们时,在运行时将virtualFields从一个模型复制到另一个模型”),但我不明白这个解决方案。我该把它放在哪里?在控制器?在find函数的模型中?
感谢您的帮助
答案 0 :(得分:4)
http://book.cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632
1.3中的virtualFields实现有一些限制。 首先,您不能在关联模型上使用virtualFields 条件,顺序或字段数组。这样做通常会导致 由于字段未被ORM替换,因此出现SQL错误。这是 因为很难估计相关的深度 可能会找到模型。
答案 1 :(得分:2)
我现在在afterFind模型回调函数中手动执行此操作:
array_walk($results,function(&$a){
if(isset($a['Address']['full_name'])) {
$a['Employee']['full_name'] = $a['Address']['full_name'];
unset($a['Address']);
}
});
可能它不好,但它有效。
答案 2 :(得分: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`)"
);
}