私は評価データベースを作成しており、初めて Cakephp を使用しています。すべてのデータ入力と編集をソートしましたが、深い関連付けからいくつかの重要なデータを取得するのに問題があります。
本質は
コース HABTM ユニット (テーブル course_units)
ユニットには多くのアーティファクトがあります
アーティファクトには 1 つの管理者アーティファクトがありますアーティファクトはユニットに属しています
AdminArtefact モデルは、アーティファクトの各年の動的データ (due_date、late_date など) に使用されます。
私の問題は、特定のコースのアーティファクトのすべての期日を取得したいときです(混雑をチェックする必要があります)
Artefacts コントローラーで再帰を「2」に設定して findAll を実行すると、必要なすべてのデータが取得されますが、返されるデータの量が原因でページが過負荷になります。そのため、必要な特定のフィールドの findAll の条件を設定したいと考えています。ただし、クエリでコースを設定することはできません-私の理解では、コースデータは「別の」クエリから取得され、次のような結果に表示されます。
[Course] => Array
(
[0] => Array
(
[id] => 2
[course_code] => C0767S
[course_name] => BSc (hons) Entertainment Technology
[course_local_code] => ET
[course_leader] => 6
[colour] =>
[CoursesUnit] => Array
そのため、クエリの一部としてコースを特定のコースに設定することはできません。これを行う必要があるため、他の豊富なデータではなく、プルしたい他のデータ要素を指定することもできます。
Unit モデルを読み込んで、バインドを HABTM ではなく belongsTo に変更しようとしましたが、同じデータセットが再び返されました。
CourseUnits コントローラーの「チェーンの上位」に行き、「$uses」を実行して、データを取得したいすべての関連テーブルを指定しようとしましたが、何も役に立ちませんでした。
HABTM を読んで、データが自動的にプルされないので、テーブルの結合を調べましたが、どのモデルを結合して機能させるかを実際に確認できませんでした。
私は今これを寝かせる必要があるので、質問をしています:特定のコースのすべてのアーティファクトの期日を取得する最もエレガントな方法は何ですか? (コース、ユニット、アーティファクト、期日が必要です...すべてのテーブルから何かが必要です)
Artefacts コントローラーで使用したい QUERY 文字列:
$data = $this->Artefact->find('all', array(
'fields' => array('Artefact.reference', 'AdminArtefact.due_date', 'ArtefactUnit.short_code', 'Course.course_code' )));
これにより、次のエラーが発生します。
エラー: SQLSTATE [42S22]: 列が見つかりません: 1054 不明な列 'Course.course_code' が 'フィールド リスト' にあります
前もって感謝します!
ケビン
関連するすべてのモデル:
class Course extends AppModel {
public $displayField = 'course_name';
public $hasAndBelongsToMany = array(
'Unit' =>
array(
'className' => 'Unit',
'joinTable' => 'courses_units',
'foreignKey' => 'course_id',
'associationForeignKey' => 'unit_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'with' => 'CoursesUnit'
)
);
public $belongsTo = array(
'CourseLeader' => array(
'className' => 'User',
'foreignKey' => 'course_leader'
)
);
class Unit extends AppModel {
public $displayField = 'short_code';
public $hasMany = array(
'UnitArtefacts' => array(
'className' => 'Artefacts',
'foreignKey' => 'unit_id'
));
public $hasAndBelongsToMany = array(
'Course' =>
array(
'className' => 'Course',
'joinTable' => 'courses_units',
'foreignKey' => 'unit_id',
'associationForeignKey' => 'course_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'with' => 'CoursesUnit'
)
);
public $belongsTo = array(
'External' => array(
'className' => 'User',
'foreignKey' => 'external_examiner'
),
'Coordinator' => array(
'className' => 'User',
'foreignKey' => 'coordinator'
),
'UnitLevel' => array(
'className' => 'Level',
'foreignKey' => 'level_id'
)
);
class Artefact extends AppModel {
public $displayField = 'reference';
public $hasOne = array(
'AdminArtefact' => array(
'className' => 'AdminArtefact',
'foreignKey' => 'artefact_id'
)
);
public $belongsTo = array(
'ArtefactUnit' => array(
'className' => 'Unit',
'foreignKey' => 'unit_id'
)
);