查找所有复杂模型

Posted

技术标签:

【中文标题】查找所有复杂模型【英文标题】:find all on complex model 【发布时间】:2014-08-30 06:37:16 【问题描述】:

我只需要从所有 4 个关联表中的查找中获取详细信息。我查看了文档,我可以从 2 个表中获取数据,但不能从其他表中获取数据。 我有一个课程表,我可以在其中只显示相关的导师 ID 行。这工作正常。我有一个与 FK 课程 ID 上的课程表相关的课程学生表。然后从这个课程学生表中,我将一个字段链接到另一个表。

课程表(fkutor_id 但没有 student_id) 导师表(链接到带有导​​师 ID 的课程表) Lesson_students 表(与课程 ID 链接并有一个学生 ID HABTM) 学生表(与课程学生表中的学生ID链接)

所以如果我从课程表中得到一行,我想要导师姓名(来自导师表,我现在可以这样做),通过 studentID 获得学生姓名。这是 4 个表,这很让人头疼,因为文档只是做简单的例子。我无法显示学生姓名或学生 ID

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

我试过这个,我猜是因为我有一个 HABTM 和一个 belongsTo 关系。当我在谷歌搜索几个小时的答案时,必须在某处记录。

$this->set('student',$this->Lesson->find('all', array('conditions' => array('Lesson.id' => 2), 'contain' => array('Student' => array('conditions' => array('Student.id' => 'Lesson.id'))))));

class LessonsController extends AppController 
   $this->set( 'tutor',$this->Lesson->find('all', array(
             'conditions'=>array('Lesson.Tutor_id'=> 1,'Lesson.id'=>'Lesson_Students.lesson_id') ) ));



view
////////

  <?php 
      foreach ($tutor as $item):

        echo '<tr><td>'. $item['Lesson']['id'].'</td>';
      //  echo '<td>'. $item['Tutor']['id']['username'].'</td>';
        echo '<td>'. $item['Lesson']['tutor_id'].'</td>';
         echo '<td>'. $item['Tutor']['last_name'].'</td>';  
           echo '<td>'. $item['Lesson_Student']['student_id'].'</td>'; 
        echo '</tr>';
     endforeach;
     unset($item);

【问题讨论】:

当我对 find 进行调试时,我确实得到了学生行,但我似乎无法将其打印出来。回声''。 $item['Lesson']['Student']['id'] 给出一个未定义的 student 值,带和不带 [lesson] 名称 学生表与课程有 HABTM 关系,所以我如何将数据与其他模型一起取出。我在调试中看到数组中的数据 【参考方案1】:

我通过手动将所有需要的连接添加到选项数组中解决了类似的问题:

'joins' => array(
    array(
        'table' => 'sales',
        'alias' => 'Sale',
        'type' => 'LEFT',
        'conditions' => array(
            'Sale.serialnumber_id = Serialnumber.id'
        )
    ),
    array(
        'table' => 'rentals',
        'alias' => 'Rental',
        'type' => 'left',
        'conditions' => array(
            'Rental.serialnumber_id = Serialnumber.id'
        )
    ),
)

然后您可以在条件数组中使用所有这些字段并将它们添加到您的字段数组中。

要优化整个查询,您应该只检索您需要的字段 - 通过添加字段选项。一个 SELECT * 查询(比如这个)是一个很慢的查询,如果无用的话会产生很多流量,尤其是当您查询多个表时。

【讨论】:

感谢您的回复。好的,但我怎样才能做到这一点并从同一个查找所有的 belongsTo 表中获取数据? 我在答案中尝试了上面的代码,但我无法在视图中显示数据。我看到了数组,但显示视图中的数据不起作用.... foreach ($student as $item2): echo ''。 $item2['学生']['id'].''; //错误 注意(8):未定义索引:显示数据时。我如何简单地在视图中显示数据,因为我的代码无法正常工作($student as $item2):echo ''。 $item2['学生']['id'].'';对此必须有一个简单的答案。 HABTM 使用起来很糟糕 我认为你的问题是,递归级别不够高。您尝试从第二级获取数据。只需将 'recursive' => 2 添加到您的选项数组中。 答案为我指明了正确的方向,但它并不完整,因此问题无法解决。我还需要一个字段列表。我想我们都在用递归和 $item2['Lesson'][]['Student']

以上是关于查找所有复杂模型的主要内容,如果未能解决你的问题,请参考以下文章

具有多个映射模型的复杂核心数据迁移

计算机网络中OSI参考模型

查找多个回调何时完成时的编程模型

查找所有关联断开的对象

解释机器学习模型的一些方法——理解复杂的机器学习模型

Web Api 模型绑定 一