从HABTM模型获取数据

时间:2014-08-31 00:31:22

标签: php cakephp

我无法从HABTM关系中的2个表中获取数据,我无法得到这些cakephp文档的答案(再次)。很抱歉询问有关应在文档中解释的问题。 这应该是一个简单的但我一直得到未定义的索引,我设置的关系似乎与文档一致。我有一篇关于更复杂问题的文章,但这个问题需要被隔离。

我不知道如何通过这个课程 - 学生HABTM表从课程表和学生表中获取相关数据。

我想要学生所做的所有课程。我希望学生表中的学生姓名和课程表中的课程详细信息,其中lesson_id作为此课程 - 学生表中的公共链接。听起来很简单,但我无法做到。

public $hasAndBelongsToMany = array(

        'Student' => array(
            'className' => 'Student',
            'joinTable' => 'lessons_students',
            'foreignKey' => 'lesson_id',
            'associationForeignKey' => 'student_id',
            'unique' => 'keepExisting',

        )
    );




class LessonsController extends AppController {

....
$this->Lesson->recursive = -1;

  $options['joins'] = array(
               array('table' => 'lessons_students',
                'alias' => 'LessonsStudent',
                'type' => 'LEFT',
                'conditions' => array(
                'Lesson.id = LessonsStudent.lesson_id',
                 )
                 ),

                array('table' => 'students',
                'alias' => 'Student',
                'type' => 'LEFT',
                'conditions' => array(
                'LessonsStudent.student_id=Student.id',
                 )
                 ),

            );

            $options['conditions'] = array('Student.id' => 2);
      //  $Item->find('all', $options);

     $student=$this->set( 'student',$this->Lesson->find('all', $options));


In the view I get the error undefined index Student
   <?php 
    //  debug($student);
      foreach ($student as $item2):
           echo '<td>'. $item2['Lesson']['id'].'</td>';    
        echo '<td>'. $item2['Student']['id'].'</td>';



http://stackoverflow.com/questions/17250215/cant-get-all-user-data-from-habtm-in-cakephp
http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

1 个答案:

答案 0 :(得分:0)

如果要使用模型关联,则需要删除$this->Lesson->recursive = -1;,因为它会禁用模型中定义的任何关联。而且你可以删除$options['joins']。 如果您在Lesson模型中定义了多个关联,并且不想获取所有关联,请使用unbindModel()或使用Containable behavior

$this->Lesson->Behaviors->load('Containable');
$this->Lesson->contain('Student');

如果您需要在许多操作中多次查找,最好在模型中启用Containable

class Lesson extends AppModel {
    public $actsAs = array('Containable');
}

所以你可以避免$this->Lesson->Behaviors->load('Containable');行;