2013-01-31 17 views
6

我已阅读文档并努力了解要做什么。另外,我已经通过了stackoverflow上的问题,并且没有任何我尝试过的帮助。在cakePHP 2.x中使用虚拟字段

我有一个下拉列表,我想列出公司中的所有员工。该列表应显示是这样的:

Name Surname (Job Title) 

在我的模型,我有这样的一段代码:

public $virtualFields = array(
    'fullname' => 'CONCAT(HrEmployee.name, " ", HrEmployee.surname, " (", HrEmployee.jobTitle, ")")' 
); 

而在我的控制,我有这样的:

$hrEmployees = $this->User->HrEmployee->find('fullname', 
    array(
     'fields' => array('HrEmployee.name','HrEmployee.surname','HrEmployee.jobTitle'), 
     'order' => array('HrEmployee.name'=>'ASC','HrEmployee.surname'=>'ASC') 
)); 

但我得到这个错误:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `User__fullname` FROM `intraweb_db`.`users` AS `User` WHERE `User`.`hr_emp' at line 1 

什么我必须改变吗?我可以看到它正在构建查询,但它正在改变它非常糟糕......

任何人都可以协助吗?

回答

3

很酷所以我修好了。部分地感谢布兰登指引我朝着正确的方向前进。

由于虚拟字段的限制,我不得不采取解决方法。

所以,在我HrEmployee模式,我这样做:

public $virtualFields = array(
    'fullname' => 'CONCAT(HrEmployee.name, " ", HrEmployee.surname, " (", HrEmployee.jobTitle, ")")' 
); 

而在我的用户模式,我把它改成这样:

class User extends AppModel { 
public function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 
    $this->virtualFields['fullname'] = $this->HrEmployee->virtualFields['fullname']; 
} 

最后,在我的UsersController,我只是改变它有点:

$hrEmployees = $this->User->HrEmployee->find('list', 
    array(
     'fields' => array("id","fullname"), 
     'order' => array('HrEmployee.name ASC','HrEmployee.surname ASC') 
)); 
3

蛋糕文档的底部指定虚拟领域的一些限制..

virtualFields的实现有一些限制。首先,您不能在条件,订单或字段数组的关联模型上使用virtualField。这样做通常会导致SQL错误,因为这些字段不会被ORM替换。这是因为很难估计可能找到相关模型的深度。

http://book.cakephp.org/2.0/en/models/virtual-fields.html#limitations-of-virtualfields

+2

谢谢。这个答案指出了我的正确方向。看到我的答案。 – Albert

+0

很高兴我能部分帮助,并感谢您发布您的解决方案! –