【问题标题】:Cakephp HABTM issue retrieving multilevel dataCakephp HABTM 问题检索多级数据
【发布时间】:2013-09-09 14:26:00
【问题描述】:

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

本质是

课程 HABTM 单元(表 courses_units)

单位有许多人工制品

Artefact 有一个管理员Artefact 人工制品属于一个单位

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 控制器中使用的查询字符串:

    $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(而不是 2)应该足以获得所有 HABTM 关联。
  • 感谢您的回复 - 我已尝试更改 Unit 和 Artefact 控制器中的递归设置,但都没有得到我想要的(在 Unit 中将其设置为 1 并不足以获得 AdminArtefact数据(并将课程作为单独的数组返回)。在 Artefacts 控制器中将其设置为 1 会丢失课程数据。凯文

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


【解决方案1】:

实际设置

'recursive' => 3,

应该可以。

【讨论】:

  • 嗨,我试过 recursive=3 - 它仍然以与 recursive = '2' 相同的形式获取数据。我已经添加了要在人工制品控制器中使用的查询字符串,但返回错误未知列。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多