Cakephp HABTM问题检索多级数据

时间:2013-09-09 14:26:00

标签: cakephp associations has-and-belongs-to-many

我正在创建一个评估数据库并首次使用cakephp。我已经对所有数据输入和编辑进行了排序,但是从深层关联中检索一些关键数据时遇到了问题:

本质是

课程HABTM单元(table courses_units)

单位有很多人工制品

Artefact hasOne AdminArtefact Artefact属于一个单位

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模型并将绑定更改为belongsTo而不是HABTM到courses_units表,但又重新获得了相同的数据集。

我已经尝试将'更高的链'转到CourseUnits控制器并执行'$ uses'并指定我想要从中提取数据的所有相关表但是没有得到任何有用的信息。

阅读HABTM它不会自动提取数据,所以我查看了加入表格,但无法真正看到哪个模型可以使连接工作。

我现在需要把它放到床上,因此我问的问题是:获得特定课程所有文物的截止日期的最优雅方法是什么? (我需要课程,单元,人工制品和截止日期...所有表格中的内容)

QUERY String我想在Artefacts控制器中使用:

    $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'
)
    );

1 个答案:

答案 0 :(得分:0)

实际设定

'recursive' => 3,

应该有用。