'fields'中的虚拟字段查找条件 - Cakephp

时间:2011-10-13 17:23:28

标签: cakephp

我有一个带有虚拟字段的学生模型:

    var $virtualFields = array(
    'full_name' => 'CONCAT(Student.fname, " ", Student.lname)'
);

我正在使用'fields'进行查找操作以获取特定字段:

$this->Student->find('all', array('fields' => array('Student.fname','Student.lname')));

由于某种原因,在找到记录后未创建虚拟字段。我尝试添加Student.full_name,但当然它在mysql中出现unknown column错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

你不能在字段中指定一个虚拟字段,你需要在没有字段选项的情况下调用它,因此它会带来结果...你可能想要阅读examples in the cookbook

调用所有字段是另一种选择,另一种是在字段选项中调用字段,类似这样

$this->Student->find('all', array('fields' => array(
    $this->student->virtualFields['full_name'].'AS Student__full_name',
    'Student.fname','Student.lname')
));

答案 1 :(得分:1)

如何在app_model.php中放置一个方法,如下所示:

/**
 * combine virtual fields with fields values of find()
 * USAGE:
 * $this->Model->find('all', array('fields' => $this->Model->virtualFields('full_name')));
 * @param array $virtualFields to include
 */
public function virtualFields($fields = array()) {
    $res = array();
    foreach ((array)$fields as $field) {
        //TODO: if key numeric => value sql!
        //TODO: allow combined/other models via Model.field syntax
        $sql = $this->virtualFields[$field];
        $res[] = $sql.' AS '.$this->alias.'__'.$field;
    }
    return $res;
}

然后像这样使用它:

$this->Model->find('all', array('fields' => $this->Model->virtualFields('full_name')))

));

左右:

$fields = $this->Model->virtualFields('full_name');
$fields = am($fields, 'status', 'created');
$this->Model->find('all', array('fields' => $fields));

));

答案 2 :(得分:1)

在CookBook上: http://book.cakephp.org/2.0/en/models/virtual-fields.html

它说你可以像以下一样使用它:

型号:

public $virtualFields = array(
'name' => 'CONCAT(User.first_name, " ", User.last_name)');

控制器或视图:

$results = $this->User->find('first');

结果:

array(
    [User] 
        [first_name] => 'Mark',
        [last_name] => 'Story',
        [name] => 'Mark Story',
        //more fields.
    )

所以你可以像这样使用它:

$this->set('list_fields', $this->User->find('list', 
array('fields' => array('first_name', 'last_name', 'name'), 
'recursive' => -1, 'condition' => ...)));