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

クールなので、私はそれを修正しました。 Brandonのおかげで私は正しい方向に向いています。

仮想フィールドの制限のため、回避策を実行する必要がありました。

だから、私のHrEmployeeモデルで、私はこれをしなかった:

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

そして、私のUserモデルで

が、私はこれにそれを変更:

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

そして最後に、私がUserControllerに、私はちょうど変更しますそれはビット:

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

ケーキ文書の最後には、仮想フィールドのいくつかの制限を指定します。..

virtualFieldsの実装にはいくつかの制限があります。まず、条件、順序、またはフィールド配列の関連モデルでvirtualFieldを使用することはできません。そうすることで、フィールドがORMに置き換えられないため、一般にSQLエラーが発生します。これは、関連するモデルが見つかる深さを見積もることが難しいためです。

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

+2

ありがとう。この答えは正しい方向に私を指摘した。私の答えを見てください。 – Albert

+0

喜んで私は部分的に手助けでき、あなたのソリューションを投稿してくれてありがとう! –

関連する問題