使用cakephp获取名称以显示在下拉列表中

时间:2013-03-20 13:06:50

标签: php cakephp cakephp-appmodel cakephp-2.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->项目 - > ProjectLeader-> HrEmployee-> find('list')但列出了所有员工。

我也尝试过指定字段,但它返回一个未知的字段错误。

我做错了什么?

3 个答案:

答案 0 :(得分:7)

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

这将只列出project_leaders表中的记录,并且最有可能,因为表本身不包含名称/标题字段(哪个蛋糕会自动选取displayField)像这样:

array(
    1 => 1
)

使用适当的查找

要获得有意义的项目负责人列表,您需要确保在project_leadershr_employees之间建立联接,一种方法是使用containable行为并简单地指定要在列表中使用的字段:

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

您的数据库结构是否适合您的需求?

拥有一个相当于说“此用户是管理员”的表可能不是最好的主意 - 如果表project_leaders是(仅)a,则更容易避免数据问题,并为您提供更简单的查询您hr_employees表上的布尔字段和project_leader_id指向hr_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);

通过这种方式,您可以通过一个查询/加入知道谁是相关项目负责人,而不需要进行两次联接来获取员工的姓名。

答案 1 :(得分:0)

您忘了定义displayField:

默认情况为

public $displayField = 'name';

只有此表格中现有的“名称”/“标题”字段才会自动知道您的下拉列表应该作为标签文本获取的内容。 要使用其他表的字段,请确保在find()选项中传递fields

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

等。然后蛋糕会知道:第一个是键,第二个是显示值。

如果您需要在下拉列表中使用组合/自定义字段/文本,请使用virtualFields

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

并将displayField设置为此full_name虚拟字段,然后使用fields,如上所述。

答案 2 :(得分:0)

您可以向ProjectLeader Model添加虚拟字段:

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

此外,将此虚拟字段添加为displayField:

public $displayField = 'name';