可通过HABTM控制的CakePHP

可通过HABTM控制的CakePHP,cakephp,has-and-belongs-to-many,containable,Cakephp,Has And Belongs To Many,Containable,为了解释我遇到的问题,我将举一个例子。比如说,我正在建立一个系统,学生可以注册一个或多个课外课程,但学校官员必须批准注册才能生效。所以我有这些模型: 课程(属于“教师”,属于“学生”) 学生(Hasandbelongasmany“课程”) 教师(有许多“课程”) 现在让我们假设我想看一份所有未经批准的九年级学生注册的列表。这很简单: $this->request->data = $this->Student->CoursesStudent->find('all'

为了解释我遇到的问题,我将举一个例子。比如说,我正在建立一个系统,学生可以注册一个或多个课外课程,但学校官员必须批准注册才能生效。所以我有这些模型:

  • 课程(属于“教师”,属于“学生”)
  • 学生(Hasandbelongasmany“课程”)
  • 教师(有许多“课程”)
现在让我们假设我想看一份所有未经批准的九年级学生注册的列表。这很简单:

$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    )
));
我正在努力解决的问题是,也要提取老师的数据(不仅仅是他们的ID)。我试过这个:

$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    ),
    'contain' => array(
        'CoursesStudent',
        'Course' => array(
            'Teacher' => array(
                'fields' => array(
                    'Teacher.id',
                    'Teacher.name'
                )
            )
        ),
        'Student'
    )
));
但是它对返回的数组没有任何影响。为了便于您将其放入现有的CakePHP项目中,可以使用数据库模式和数据,并且可以将其粘贴到现有CakePHP项目的随机操作中。这就是我想要得到的(注意老师的数据在那里):


谢谢

在使用
contain()
之前,必须将
$recursive
设置为
-1

另外,确保您的模型设置为使用可包含行为。在本例中,由于“课程”也包含某些内容,因此它也需要使用可包含的行为

(您可以考虑在AppModel中设置下面的
$actsAs
,使每个模型都可以使用Containable。)

下面是您的发现,但首先设置递归:

$this->Student->CoursesStudent->recursive = -1;
$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    ),
    'contain' => array(
        'CoursesStudent',
        'Course' => array(
            'Teacher' => array(
                'fields' => array(
                    'Teacher.id',
                    'Teacher.name'
                )
            )
        ),
        'Student'
    )
));

出于好奇,您将模型find保存到
$this->request->data
的目的是什么?该对象是为通过表单提交的数据保留的。首先:您可以将recursive设置为0或-1。第二:删除contain,这只会帮助您缩小已知通过模型传递的数据范围。Contain不会帮助您查询其他数据。第三:如果第一个选项正确,您的模型可能无法正确设置。让我们看一看这些。@TimJoyce我的理解是,例如,对于编辑表单,
$this->request->data
中的数据将用于填充表单。您也可以使用
$this->data
,对吗?也许这更正确。是的。。。那是对的。。我已经习惯了这种魔术的发生!如果您运行
$this->Student->find('all')
当你看到你的
老师
结果出来时,将你的查找模型更改为
$this->Student->Course->find('all')他们没有在新的2.x版本中显示此文档,但它在1.2版本中。
//in your CoursesStudent model (and in your Course model)
public $actsAs = array('Containable');
$this->Student->CoursesStudent->recursive = -1;
$this->request->data = $this->Student->CoursesStudent->find('all', array(
    'conditions' => array(
        'CoursesStudent.is_approved' => null,
        'Student.grade' => 9
    ),
    'contain' => array(
        'CoursesStudent',
        'Course' => array(
            'Teacher' => array(
                'fields' => array(
                    'Teacher.id',
                    'Teacher.name'
                )
            )
        ),
        'Student'
    )
));