2013-01-31 16 views
6

Tôi đã đọc qua tài liệu và đấu tranh để hiểu phải làm gì. Ngoài ra, tôi đã đọc qua các câu hỏi ở đây trên stackoverflow, và không có gì mà tôi đã cố gắng giúp đỡ.Sử dụng các trường ảo trong cakePHP 2.x

Tôi có một danh sách thả xuống mà tôi muốn liệt kê tất cả nhân viên trong công ty. Danh sách này sẽ được hiển thị như thế này:

Name Surname (Job Title) 

Trong mẫu của tôi, tôi có đoạn mã này:

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

Và trong bộ điều khiển của tôi, tôi có điều này:

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

Nhưng Tôi gặp lỗi này:

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 

Điều gì tôi phải thay đổi? Tôi có thể thấy rằng nó đang xây dựng các truy vấn, nhưng nó đang thay đổi nó khủng khiếp xấu ...

Bất cứ ai có thể hỗ trợ?

Trả lời

3

Để tôi khắc phục. Một phần nhờ Brandon đã chỉ cho tôi đúng hướng.

Do giới hạn trường ảo, tôi phải thực hiện giải pháp thay thế.

Vì vậy, trong mô hình HrEmployee của tôi, tôi đã làm điều này:

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

Và trong mô hình tài khoản của tôi, tôi đã thay đổi nó như thế này:

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']; 
} 

Và cuối cùng, trong UsersController của tôi, tôi chỉ cần thay đổi một chút:

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

Phần dưới cùng của tài liệu bánh quy định một số giới hạn của các trường ảo ..

Việc triển khai virtualFields có một vài hạn chế. Trước tiên, bạn không thể sử dụng virtualFields trên các mô hình liên quan cho các điều kiện, thứ tự hoặc các mảng trường. Làm như vậy thường sẽ dẫn đến lỗi SQL vì các trường không được thay thế bằng ORM. Điều này là do khó ước tính độ sâu mà tại đó một mô hình liên quan có thể được tìm thấy.

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

+2

Cảm ơn. Câu trả lời này chỉ cho tôi đi đúng hướng. Xem câu trả lời của tôi. – Albert

+0

Vui vì tôi có thể giúp đỡ một phần và cảm ơn bạn đã đăng giải pháp của mình! –

Các vấn đề liên quan