我有一个带有虚拟字段的学生模型:
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
错误。
有什么想法吗?
答案 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' => ...)));