CakePHP:包含模型相关数据字段的虚拟字段

时间:2010-09-30 15:02:59

标签: php cakephp cakephp-1.3

我有一个模型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函数的模型中?

感谢您的帮助

3 个答案:

答案 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`)"
    );
}