我正在创建一个评估数据库并第一次使用 cakephp。我已经对所有数据输入和编辑进行了排序,但是在从深度关联中检索一些关键数据时遇到了麻烦:
本质是
课程 HABTM 单元(表 course_units)
单位有许多文物
Artefact hasOne AdminArtefact Artefact belongsTo an Unit
AdminArtefact 模型用于人工制品的每年动态数据(due_date、late_date 等)。
我的问题是当我想获得特定课程的所有人工制品的到期日期时(我们需要检查是否有拥堵)
如果我在 Artefacts 控制器中执行 findAll 并将递归设置为“2”,它会获取我需要的所有数据......但由于返回的数据量,它会使页面过载。所以我想为我需要的特定字段设置 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 模型并将绑定更改为 belongsTo 而不是 HABTM 到 course_units 表,但再次获得了相同的数据集。
我已经尝试将“更高的链”转到 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'
)
);