CakePHP - 另一个关系表中的SUM数据

时间:2012-12-04 20:53:35

标签: php mysql cakephp

我不知道工作人员参加课程和集会的总时数。这是我的数据库: -

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     |
+---+-------+-----------+------------+

1 个答案:

答案 0 :(得分:0)

除非您正在进行联接(请参阅CakePHP Joins),否则您将无法获得这样的SUM,因为CakePHP将实际运行单个查询,然后组合并返回数据。

我认为您最好的选择是跟踪“员工”表格中Staff.course_hoursStaff.assembly_hours字段的总小时数。您仍然可以将单个行保留在Assembly.hoursCourse.hours中,然后保存在afterSave()(请参阅CakePHP afterSave)回调(或类似内容)中,更新工作时间字段。

然后,您可以设置一个名为total_hours的虚拟字段(请参阅CakePHP Virtual Fields),您可以对其进行排序,显示或用于您需要的任何内容。

或者,您可以构建联接并在单个(虽然稍微复杂一点)查询中执行。