我想在下拉列表中显示所有项目负责人的姓名。
项目负责人只是在公司工作的一些员工。
以下是我的表格:
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')但列出了所有员工。
我也尝试过指定字段,但它返回一个未知的字段错误。
我做错了什么?
答案 0 :(得分:7)
$this->set('projectLeaders',$this->Project->ProjectLeader->find('list'));
这将只列出project_leaders
表中的记录,并且最有可能,因为表本身不包含名称/标题字段(哪个蛋糕会自动选取displayField
)像这样:
array(
1 => 1
)
要获得有意义的项目负责人列表,您需要确保在project_leaders
和hr_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';