7

私はドキュメントを読み、何をすべきかを理解するのに苦労しました。また、私はここでスタックオーバーフローに関する質問を読みましたが、私が試したものは何も役に立ちませんでした。

会社のすべての従業員を一覧表示したいドロップダウンがあります。リストは次のように表示されます。

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

何を変更する必要がありますか?クエリを作成していることがわかりますが、変更がひどく悪いです...

誰かが助けることができますか?

4

2 に答える 2

4

かっこいいので直しました。正しい方向に向けてくれた Brandon に部分的に感謝します。

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

したがって、私の 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')
));
于 2013-01-31T18:00:35.183 に答える
3

Cake ドキュメントの下部には、仮想フィールドの制限がいくつか指定されています。

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

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

于 2013-01-31T16:49:46.393 に答える