Cakephp下拉列表(selectlist)+如何显示模型和相关模型的值



我想在下拉列表(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;
}

可能有一种更经典的方法来格式化您想要返回的列表,但这说明了一般的想法。

最新更新