我想在下拉列表(selectlist)中显示,该列表连接了来自模型的字段值和来自相关模型的字段。我有一个表"working_day",它链接到表"user"one_answers"pause"。在视图"Pause"(添加和编辑)中,我有一个下拉列表,显示working_day_id,但我希望显示"WorkingDay"的字段"date"one_answers"User"的字段字段"username"
例如:2016年4月13日(杰罗姆S)
我已经尝试过$virtualfield,当我使用"WorkingDay"中的字段时它有效,但当我使用来自"User"的字段时不起作用。
数据库模式
我尝试过的$virtualfield:
public $virtualFields = array('workingday_display_field' => 'concat(WorkingDay.date_working_day, " (", User.username, ")")');
public $displayField = 'workingday_display_field';
我也尝试了下面提出的解决方案,但它不起作用,出现了同样的问题:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['workingday_display_field'] = sprintf('concat(%s.date_working_day, " (", %s.username, ")")', $this->alias, $this->User->alias);
$this->displayField = "workingday_display_field";
}
有人知道如何解决这个问题吗
提前谢谢。
当使用不同的Model别名时,这样做会有一些问题,另一种推荐的方法是在Models构造方法中处理这些问题:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['name'] = sprintf('CONCAT(%s.first_name, " ",%s.last_name)', $this->alias, $this->alias);
$this->virtualFields['namewithemail'] = sprintf('CONCAT(%s.first_name, " ", %s.last_name, " (", %s.email, ")")', $this->alias, $this->alias, $this->alias);
$this->displayField = "namewithemail";
}
这在本书的这一节中有描述:http://book.cakephp.org/2.0/en/models/virtual-fields.html#virtual-字段和模型别名
我也有类似的情况,需要创建一个列表,将不同表中的两个字段组合在一起。我最终做的是重写find()以返回适当的列表。
public function find($type = 'first', $params = array()) {
$workingdays = array();
if ($type == 'list'){
$params = array_merge(
array('contain' => array('User')),
$params
);
$workingdaysUnformatted = parent::find('all', $params);
foreach($workingdaysUnformatted as $workingday){
$workingdays['WorkingDay']['workingday_display_field'] = $workingday['WorkingDay']['date'].' ('.$workingday['User']['username'].')'
}
}
else
$workingdays = parent::find($type, $params);
return $workingdays;
}
可能有一种更经典的方法来格式化您想要返回的列表,但这说明了一般的想法。