2

ドロップダウンリストにすべてのプロジェクトリーダーの名前を表示したいと思います。

プロジェクトリーダーは、会社で働く従業員のほんの一部です。

これが私のテーブルです:

project_leaders
,----,----------------,
| id | hr_employee_id |
|----|----------------|
| 1  |  18            |
'----'----------------'

projects
,----,------,-------------------,
| id | name | project_leader_id |
|----|------|-------------------|
| 1  | cake |         1         |
'----'------'-------------------'

hr_employees
,----,------,---------,
| id | name | surname |
|----|------|---------|
| 18 | joe  | dirt    |
'----'------'---------'

私のProjectsControllerは次のようになります。

public function add() {
    if ($this->request->is('post')) {
        $this->Project->create();
        if ($this->Project->save($this->request->data)) {
            $this->_sendProjectRequestEmail($this->Project->getLastInsertID() );
            $this->Session->setFlash(__('The project has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The project could not be saved. Please, try again.'));
        }
    }
    $this->set('projectLeaders',$this->Project->ProjectLeader->find('list');
}

これは、名前と名前ではなく、プロジェクトリーダーのIDのみを返します。したがって、Joe Dirtの代わりに、1を返します。

$ this-> Project-> ProjectLeader-> HrEmployee-> find('list')を実行しようとしましたが、すべての従業員が一覧表示されます。

フィールドを指定しようとしましたが、不明なフィールドエラーが返されます。

私は何が間違っているのですか?

4

3 に答える 3

7
$this->set('projectLeaders',$this->Project->ProjectLeader->find('list'));

これは、テーブルからレコードをリストするだけで、project_leadersテーブル自体には名前/タイトル フィールドが含まれていないため (どのケーキが として自動的に取得されるdisplayFieldか)、次のようになります。

array(
    1 => 1
)

適切な検索を使用する

プロジェクト リーダーの意味のあるリストを取得するには、結合を取得する必要があります。これproject_leadershr_employees行う 1 つの方法は、containable動作を使用し、リストで使用するフィールドを指定するだけです。

$projectLeaders = $this->Project->ProjectLeader->find('list', array(
    'contain' => array(
        'HrEmployee'
    ),
    'fields' => array(
        'ProjectLeader.id',
        'HrEmployee.name',
    )
));
$this->set(compact('projectLeaders'));

あなたのデータベース構造はあなたのニーズに合っていますか?

「このユーザーは管理者です」と言うのと同等のテーブルを持つことは最良のアイデアではないかもしれません.テーブルが(のみ)テーブルproject_leadersのブールフィールドであり、.他のデータ抽象化ではなく、テーブル。hr_employeesproject_leader_idhr_employee

もちろん、私はあなたのスキーマ全体を知りません.別のproject_leadersテーブルを持つ十分な理由があるかもしれません.

あるいは - 非正規化

名前フィールドを - に追加する場合project_leaders、プロジェクト リーダーの名前やファンキーさを知るために結合する必要はありません。

alter table project_leaders add name varchar(255) after id;
update project_leaders set name = (select name from hr_employees where hr_employees.id = hr_employee_id);

このようにして、従業員の名前を取得するために 2 つの結合を実行する代わりに、1 つのクエリ/結合で関連するプロジェクト リーダーが誰であるかを知ることができます。

于 2013-03-20T22:00:59.263 に答える
0

ProjectLeader モデルに仮想フィールドを追加できます。

public $virtualFields = array (
'name' => 'SELECT name FROM hr_employees AS Employee WHERE Employee.id = ProjectLeader.employee_id'
);

また、この仮想フィールドを displayField として追加します。

public $displayField = 'name';
于 2013-03-20T15:59:49.567 に答える
0

displayField を定義するのを忘れました:

デフォルトのケースは

public $displayField = 'name';

そして、このテーブルの既存の「名前」/「タイトル」フィールドに対してのみ、ケーキはドロップダウンがラベルテキストとして何を取得すべきかを自動的に認識します。他のテーブルのフィールドを使用するには、必ずfieldsfind() オプションを渡してください:

'fields' => array('Project.id', 'Project.name');

Cake は、最初のものはキーであり、2 番目のものは表示値であることを認識します。

ドロップダウンで結合/カスタム フィールド/テキストが必要な場合は、virtualFields を使用します

public $virtualFields = array(
    'full_name' => 'CONCAT(...)'
);

次に、displayField をこのfull_name仮想フィールドに設定するか、fields上記で説明したように使用します。

于 2013-03-20T13:39:15.147 に答える