开发者

CakePHP: virtual fields containing model related data fields

I've got a model Employee which belongsTo an Address-model. When I fetch data from the Employees model, the associated Address record gets fetched too. Additionally, the Address model has a virtualField full_name. This looks like this:

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
                ...

I want to have included this virtualField in the Employee part of the data array too, like

Array (
[0] => Array (
        [Employee] => Array
            (
                [id] => 1
                [full_name] => B开发者_运维知识库lah Blubb
                ...
            )

Tis isn't possible to solve by just adding

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

to the Employees model, as the Cookbook states There is a solution proposed ("copy virtualFields from one model to another at runtime when you need to access them"), but I don't understand this solution. Where do I have to place this? In the controller? In the model in the find function?

Thanks for Help


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

The implementation of virtualFields in 1.3 has a few limitations. First you cannot use virtualFields on associated models for conditions, order, or fields arrays. Doing so will generally result in an SQL error as the fields are not replaced by the ORM. This is because it's difficult to estimate the depth at which an associated model might be found.


I'm doing this by hand now in the afterFind model callback function:

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

Might be it's not nice, but it works.


Add the following to your model:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜