我不知道工作人员参加课程和集会的总时数。这是我的数据库: -
staffs
+---+-------+-----------+
| id| Name | Department|
+---+-------+-----------+
| 1 | Joe | HR |
| 2 | Andra | Support |
| 3 | Khan | HR |
| 4 | Toll | HR |
| 5 | Gosh | Support |
| 6 | Rama | Support |
+---+-------+-----------+
attendances
+---+---------+-----------+--------------+
|id | name_id | course_id | assembly_id |
+---+---------+-----------+--------------+
| 1 | 1 | 101 | |
| 2 | 1 | 102 | |
| 3 | 1 | | 501 |
| 4 | 2 | 102 | |
| 5 | 3 | | 502 |
| 6 | 3 | 103 | |
| 7 | 4 | 101 | |
| 8 | 4 | | 501 |
| 9 | 4 | 102 | |
+---+---------+-----------+--------------+
courses
+-------+-----------+-------+
| id | name | hours |
+-------+-----------+-------+
| 101 | courses_1 | 8 |
| 102 | courses_2 | 6 |
| 103 | courses_3 | 9 |
+-------+-----------+-------+
assembly
+-------+---------------+-------+
| id | name | hours |
+-------+---------------+-------+
| 501 | assembly_1 | 2 |
| 502 | assembly_2 | 4 |
+-------+---------------+-------+
在模型>出席我已经添加了一个关系: -
public $belongsTo = array('Staff','Course','Assembly');
在我的控制器中,我尝试编写此代码: -
$view = $this->Staff->find('all',array(
'fields' => array('SUM(COALESCE(Course.hours,0))+SUM(COALESCE(Assembly.hours,0)) as ec_count'),'recursive'=>2));
$this->set('view', $view);
但它会返回错误..(看起来我在这里做错了)
如何编写具有此条件的代码,它将通过以下视图显示: -
+---+-------+-----------+------------+
| id| Name | Attend | Total Hour |
+---+-------+-----------+------------+
| 1 | Joe | course_1 | 16 |
| | | course_2 | |
| | | assembly_1| |
| 2 | Andra | course_2 | 6 |
| 3 | Khan | assembly_2| 13 |
| | | course_3 | |
| 4 | Khan | course_1 | 16 |
| | | assembly_1| |
| | | course_2 | |
| 5 | Gosh | - | 0 |
| 6 | Rama | - | 0 |
+---+-------+-----------+------------+
答案 0 :(得分:0)
除非您正在进行联接(请参阅CakePHP Joins),否则您将无法获得这样的SUM,因为CakePHP将实际运行单个查询,然后组合并返回数据。
我认为您最好的选择是跟踪“员工”表格中Staff.course_hours
和Staff.assembly_hours
字段的总小时数。您仍然可以将单个行保留在Assembly.hours
和Course.hours
中,然后保存在afterSave()
(请参阅CakePHP afterSave)回调(或类似内容)中,更新工作时间字段。
然后,您可以设置一个名为total_hours
的虚拟字段(请参阅CakePHP Virtual Fields),您可以对其进行排序,显示或用于您需要的任何内容。
或者,您可以构建联接并在单个(虽然稍微复杂一点)查询中执行。