检索多级数据的Cakephp HABTM问题

检索多级数据的Cakephp HABTM问题,cakephp,associations,has-and-belongs-to-many,Cakephp,Associations,Has And Belongs To Many,我正在创建一个评估数据库,并首次使用cakephp。我已对所有数据输入和编辑进行了排序,但在从深层次关联中检索一些关键数据时遇到困难: 其实质是 课程HABTM单元表课程单元 这个单位有许多手工艺品 手工艺品只有一件手工艺品 属于一个单位的人工制品 AdminArtefact模型用于每一年的人工制品到期日、过期日等动态数据 我的问题是,当我想得到一个特定课程的所有人工制品的到期日,我们需要检查是否有人手拥挤 如果我在Artefacts控制器中使用递归设置为“2”的findAll,它将获得我需要的

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

其实质是

课程HABTM单元表课程单元

这个单位有许多手工艺品

手工艺品只有一件手工艺品 属于一个单位的人工制品

AdminArtefact模型用于每一年的人工制品到期日、过期日等动态数据

我的问题是,当我想得到一个特定课程的所有人工制品的到期日,我们需要检查是否有人手拥挤

如果我在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
因此,作为查询的一部分,我不能将过程设置为一个特定的过程,我需要这样做,我还可以指定要提取的其他数据元素,而不是其他数据的丰富性

我尝试加载单元模型,并将绑定改为belongsTo,而不是HABTM改为courses\u units表,但再次获得了相同的数据集

我试着去CourseUnits控制器的“更高层次”,做一个“$uses”,并指定了我想要从中提取数据的所有相关表,但没有得到任何有用的结果

在HABTM上阅读,它不会自动拉取数据,所以我查看了连接表的情况,但实际上看不到要使连接工作的模型

我现在需要把它放在床上,因此我要问一个问题:什么是最优雅的方式来获得特定课程所有人工制品的到期日期?我需要课程、单元、人工制品和截止日期……所有表格中都有

我想在Artefacts控制器中使用的查询字符串:

    $data = $this->Artefact->find('all', array(
   'fields' => array('Artefact.reference', 'AdminArtefact.due_date', 'ArtefactUnit.short_code', 'Course.course_code' )));
这会产生以下错误:

错误:SQLSTATE[42S22]:未找到列:“字段列表”中的1054未知列“课程.课程代码”

提前谢谢

凯文

所有相关型号:

    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'
)
    );
实际设置

'recursive' => 3,

应该可以工作。

将递归设置为1而不是2应该足以获得所有HABTM关联。感谢您的回复-我已尝试在装置和人工制品控制器中更改递归设置,如果在单元中将其设置为1,则没有一个能够得到我想要的结果,因为没有足够的深度来获取AdminArtefact数据并将课程作为一个单独的数组返回。在Artefacts controller中将其设置为1会丢失课程数据。KevinHi,我试过recursive=3——它仍然以与recursive='2'相同的形式获取数据。我已经添加了要在artefacts控制器中使用的查询字符串,但返回了错误未知列。