根据条件创建虚拟字段

时间:2013-05-03 08:09:02

标签: cakephp cakephp-2.0

美好的一天。 :)我是CakePHP的新手所以请耐心等待。

我有一名模范学生。学生的属性状态是整数。我想根据学生的状态创建虚拟字段。

示例:

 Status     VirtualField
    1        new student
    2        new student - transferee
    3        old student - shiftee
    4        old student

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

您没有指定您正在使用的RDMS,我假设MySQL

使用固定字符串

如果你想让这个虚拟字段基于固定字符串,你可以通过MySQL中的CASE实现这个目的,并使用它来定义虚拟字段

$this->MyModel->virtualFields['status_title'] = "
    CASE 
        WHEN status = 1 THEN 'new student'
        WHEN status = 2 THEN 'new student - transferee'
        WHEN status = 3 THEN 'old student - shiftee'
        WHEN status = 4 THEN 'old student'
        ELSE 'unkown status'
    END
";

或者,在模型本身内定义它;

class Student extends AppModel {

    public $virtualFields = array(
        'status_title' => "
            CASE 
                WHEN status = 1 THEN 'new student'
                WHEN status = 2 THEN 'new student - transferee'
                WHEN status = 3 THEN 'old student - shiftee'
                WHEN status = 4 THEN 'old student'
                ELSE 'unkown status'
            END
        ",
    );
}

使用单独的表格

在我的回答中,我假设您正在尝试使用固定字符串作为标题。最好使用单独的数据库表来存储状态,并(可选)为其创建虚拟字段;

你的学生模特;应用程序/型号/ Student.php

class Student扩展AppModel {

public $belongsTo = array(
    'Status' => array(
        'type' => 'INNER',
    ),
};

}

您的状态模型;应用程序/型号/ Status.php

class Status扩展AppModel {

public $useTable = 'statuses';

public $hasMany = array(
    'Student',
};

}

您的数据库表应该是这样的;

生;

id         primary key, autonumber
status_id  id
name       varchar(50),
-- etc.

状态

id         primary key, autonumber
name       varchar(50),

检索学生时,应自动包含状态;

例如

$data = $this->Student->find('all', array(
    'fields' => array(
        'Student.id',
        'Student.name',
        'Status.name',
    ),
    'recursive' => 1,
));

应该归还所有学生及其状态

如果您想将状态名称添加为虚拟字段'并将其包含在“学生”中。阵列的索引;

// Create the virtual field
$this->Student->virtualFields['status_name'] = 'Status.name';

// And use it inside your query
$data = $this->Student->find('all', array(
    'fields' => array(
        'Student.id',
        'Student.name',
        'Student.status_name',
    ),
    'recursive' => 1,
));