我正在尝试做两件事之一,使用模型中的虚拟字段作为我的连接模型中的显示字段,或者使用虚拟字段作为我的连接模型中的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。
答案 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);