2011-10-13 62 views
2

我有一个虚拟领域的学生模型:虚拟场 - CakePHP的

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

我做的查找操作来获取特定领域使用“域”:

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

由于某些原因,查找记录后未创建虚拟字段。我试着添加Student.full_name,但是它当然会在mysql中给出unknown column错误。

任何想法?

回答

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

有关放置的方法在你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)); 

));

+1

我提高一点点,并增加了一些更多的功能 - 如果你有兴趣:http://www.dereuromark.de/2011/10/13 /工作与虚拟场合cake1-3 / – mark

1

在食谱: 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' => ...)));