CakePHP将virtualField加入displayField

时间:2013-11-21 02:13:22

标签: cakephp field virtual

我正在尝试做两件事之一,使用模型中的虚拟字段作为我的连接模型中的显示字段,或者使用虚拟字段作为我的连接模型中的find('list')中的显示

这是当前的布局:

模型

<?php
class Participant extends AppModel {
    public $hasMany = array('Registration');

    public $virtualFields = array(
        'full_name' => 'CONCAT(last_name, ", ", first_name)'
    );

    public $displayField = 'full_name';
}
 -----
class Contest extends AppModel {
    public $hasMany = array('Registration');

}
-----
class Registration extends AppModel {
    public $belongsTo = array('Participant', 'Contest');
    public $hasMany = array('Assignment');

}
?>

表格如下:

participants          contests       registrations
------------          ---------      --------------
id                    id             id
first_name            name           contest_id
last_name                            participant_id

在我的竞赛控制器中,我正在尝试开发一个列表,以便在视图中将其视为复选框。

以下是我的竞赛控制员的摘录:

$this->loadModel('Registration');
        $this->set('registrations', $this->Registration->find(
                'list',
                        array(
                            'conditions' => array('contest_id' => $contestId),
                            'recursive' => 1
                        )
            )
        );
//$contestId is defined previously, and I have verified such.

这一切实际上都可以正常运行,并且在视图中将显示一列复选框,其中registration_id作为复选框旁边的标签。

我希望将Participant模型中定义的full_name作为Registration模型的displayField。我一直在寻找,似乎找不到这样做的好方法。我希望我有足够的描述性,如果您有任何问题,请告诉我,我会尝试更好地解释。谢谢。

编辑:我正在使用CakePHP 2.4。

1 个答案:

答案 0 :(得分:1)

尝试添加'fields'参数

$this->loadModel('Registration');
$this->set('registrations', $this->Registration->find(
    'list',
    array(
        'fields' => array('Registration.id', 'Participant.full_name'),
        'conditions' => array('contest_id' => $contestId),
        'recursive' => 1
    )
));

编辑:当使用带有'fields'选项的find()时,显然cake不会放置关联模型的虚拟字段。

所以你必须自己构建你的数组,希望你的模型使用可包含的行为

$registrations =  $this->Registration->find(
    'all',
    array(
        'contain' => array(
            'Participant' => array('full_name')
        ),
        'conditions' => array('contest_id' => $contestId),
    )
);
$registrations =  Hash::combine($registrations, '{n}.Registration.id', '{n}.Participant.full_name');
$this->set('registrations', $registrations);