如何在cakehp2.6中创建一个具有可容纳行为的虚拟字段


How to create a virtual field with containable behavior in cakephp 2.6

我在模型中有这个代码用户:

 $hasOne = array(
    'Member' => array(
        'className' => 'Member',
        'foreignKey' => 'user_id',
        'dependent' => true
        )
    );

function rest_findUserById($id = NULL) {
    $row = $this->find(
       'first', 
       array(
            'contain' => array(
                'UserSession'=>array(
                    'fields'=>array('user_id', 'session_token')
                ) ,
                'Member' => array(
                    'fields' => array("*")
                )
             ), 
           'fields' => array('username', 'email'), 
           'conditions' => array('User.id' => $id)
        ));
        if (!$row) {
            return FALSE;
        }
        debug($row);exit;
}

模型内成员:

$virtualFields = array(
            'full_name' => 'CONCAT(Member.first_name, " ",Member.last_name)'
        ); 
  $belongsTo = array(
        'Country' => array(
            'className' => 'Country',
            'foreignKey' => 'country_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),

          'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
?>

当我调用函数rest_findUserById()时,我会得到以下输出:

/app/Model/User.php (line 378)
array(
    'User' => array(
        'username' => 'testuser',
        'email' => 'test@gmail.com',
        'id' => '71'
    ),
    'Member' => array(
        'id' => '11',
        'user_id' => '71',
        'first_name' => 'Whjc',
        'last_name' => 'test_user_lname',
        'email' => '',
        'phone' => '778899554455',
        'image_dir' => '11',
        'image' => '92e20fd0260dcc5ea289611221723b6a.jpg',
        'address_line_1' => 'Shhd',
        'address_line_2' => 'sdf',
        'city' => 'Los Angeles Area',
        'state' => 'delhi',
        'country_id' => '0',
        'zip_code' => '56456',
        'is_address_different' => false,
        'date_of_birth' => '0000-00-00',
        'referred_by' => 'asdf',
        'created' => '2016-07-27 13:52:30',
        'created_by' => '3',
        'modified' => '2016-08-02 12:25:22',
        'modified_by' => '3',
        'status' => false
    ),
    'UserSession' => array(
        (int) 0 => array(
            'user_id' => '71',
            'session_token' => 'a685b3db5ab87a928716c7d8b3272572'
        )
    )
)

但是当我调用这个代码时:

 $this->Member->recursive = -1;
        debug($this->Member->find('first'));

我得到这个输出:

/app/Model/User.php(第377行)

array(
    'Member' => array(
        'id' => '4',
        'user_id' => '64',
        'first_name' => 'SDFS SDF',
        'last_name' => 'test_user_lname',
        'email' => '',
        'phone' => '778899554455',
        'image_dir' => '',
        'image' => '',
        'address_line_1' => 'sdf',
        'address_line_2' => 'sdf',
        'city' => 'Los Angeles Area',
        'state' => 'delhi',
        'country_id' => '0',
        'zip_code' => '56456',
        'is_address_different' => false,
        'date_of_birth' => '1970-01-01',
        'referred_by' => 'asdf',
        'created' => '2016-07-22 15:25:30',
        'created_by' => '0',
        'modified' => '2016-07-22 15:25:30',
        'modified_by' => '0',
        'status' => false,
        'full_name' => 'SDFS SDF test_user_lname'
    )
)

正如您所看到的,虚拟字段"fullname"出现在第二个输出中,但不在第一个输出中。我该怎么解决这个问题?

从手动

不能在关联型号上使用virtualFields

建议的解决方案是将虚拟字段复制到您的模型中,这样

/app/Model/User.php

$this->virtualFields['member_full_name'] = $this->Member->virtualFields['full_name'];

当然,这不适用于hasMany或HABTM关系。还要注意,通过这种方式,您将在User数据数组中找到虚拟字段,而不是在Member数据数组