2013-01-31 11 views
6

Przeczytałem dokumentację i starałem się zrozumieć, co należy zrobić. Ponadto przeczytałem tutaj pytania na temat stackoverflow i nic, co próbowałem nie pomogło.Korzystanie z wirtualnych pól w CakePHP 2.x

Mam drop-up, że chcę wymienić wszystkich pracowników w firmie. Lista powinna być wyświetlona tak:

Name Surname (Job Title) 

w moim modelu, mam ten fragment kodu:

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

I w moim kontrolera, mam to:

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

Ale Otrzymuję ten błąd:

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 

Co muszę zmienić? Widzę, że to budowanie zapytania, ale zmienia to strasznie źle ...

Czy ktoś może pomóc?

Odpowiedz

3

Chłodny więc naprawiłem go. Częściowo dzięki Brandonowi za skierowanie mnie we właściwym kierunku.

Ze względu na ograniczenie pola wirtualnego musiałem obejść ten problem.

Tak, w moim modelu HrEmployee Zrobiłem to:

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

A w moim modelu użytkownika, zmieniłem go na:

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

I wreszcie, moim UsersController, po prostu zmienił to trochę:

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

Dno dokumentu ciasto określa pewne granice pól wirtualnych ..

Realizacja virtualFields ma kilka ograniczeń. Po pierwsze nie można używać wirtualnych pól w skojarzonych modelach dla warunków, kolejności lub tablic pól. Powoduje to generalnie błąd SQL, ponieważ pola nie są zastępowane przez ORM. Dzieje się tak dlatego, że trudno jest oszacować głębokość, z jaką można znaleźć skojarzony model.

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

+2

Dzięki. Ta odpowiedź wskazała mi właściwy kierunek. Zobacz moją odpowiedź. – Albert

+0

Cieszę się, że mogłem częściowo pomóc i dziękuję za opublikowanie rozwiązania! –

Powiązane problemy