0

再会。:) 我是 cakePHP 新手,所以请多多包涵。

我有一个模范学生。学生有一个属性状态,它是一个整数。我想根据学生身份创建虚拟字段。

例子:

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

任何帮助将不胜感激。谢谢。

4

1 回答 1

3

你没有指定你正在使用什么 RDMS,我假设 MySQL

使用固定字符串

如果你想拥有这个基于固定字符串的 virtualField ,你可以通过CASEMySQL 中的 a 来实现,并使用它来定义 virtualField

$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
        ",
    );
}

使用单独的表格

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

您的学生模型;应用程序/模型/学生.php

学生类扩展 AppModel {

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

}

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

类状态扩展 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,
));
于 2013-05-03T08:45:17.903 回答