2013-01-31 46 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

很高興我能部分幫助,並感謝您發佈您的解決方案! –