1

スタッフがコースや集会に参加した合計時間の結果を得ることができるかどうかはわかりません。ここに私のデータベースがあります:-

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

1 に答える 1

0

結合(CakePHP結合を参照)を実行していない限り、CakePHPは実際に個々のクエリを実行し、データを結合して返すため、そのようなSUMを取得することはできません。

「スタッフ」テーブル内の合計時間Staff.course_hoursとフィールドを追跡するのが最善の策だと思います。とStaff.assembly_hoursの個々の行を保持することはできますが、(CakePHP afterSaveを参照)コールバック(または同様のものを参照)で、スタッフ時間フィールドを更新します。Assembly.hoursCourse.hoursafterSave()

次に、と呼ばれる仮想フィールド( CakePHP仮想フィールドを参照)を設定するだけで、total_hours並べ替え、表示、または必要なものに使用できます。

または、結合を作成して、単一の(少し複雑ですが)クエリで実行することもできます。

于 2012-12-05T01:11:08.270 に答える