CakePHP - 有没有直接查询HABTM表的方法?

时间:2011-08-30 00:43:07

标签: cakephp

我正在尝试检查教师试图管理教室(在我的应用程序的情况下)是否实际上负责给定的教室。老师讨论教室和反之亦然。

有没有办法在Teacher模型中编写一个方法,我提供用户ID和Classroom ID,并根据与Classroom相对应的Teacher返回true或false。

我尝试使用以下代码,但它给了我很多关于我不需要的模型的额外信息。必须有更好的方法:

$this->bindModel(array('hasOne' => array('ClassroomsTeachers')));
    return $this->find('all', array(
            'conditions' => array('ClassroomsTeachers.teacher_id' => $id),
    ));

由于

2 个答案:

答案 0 :(得分:2)

HABTM关系只是hasMany-belongsTo关系的抽象 课堂上有很多课堂教师都属于老师 您可以像任何其他模型一样访问加入模型。如果表格为classrooms_teachers,则模型名称为ClassroomsTeacher(ClassroomsTeachers的单数)。

$this->Classroom->ClassroomsTeacher->find('count', array(
    'conditions' => array('teacher_id' => $id, 'classroom_id' => $classroomId)
));

答案 1 :(得分:-1)

“蛋糕”的方式如下:

$this->Classroom->find('first',array(
    'conditions'=>array(
        'Classroom.id'=>$classrom_id_var
    ),
    'recursive'=>1
)

这使用默认的recursive标志。我强烈推荐类似的内置Containable行为,因此您可以执行以下操作:

$classdata = $this->Classroom->find('first',array(
    'conditions'=>array(
        'Classroom.id'=>$classrom_id_var
    ),
    'contain'=>array('Classroom')
)

其中任何一个都会为您提供类似于以下内容的数组:

array(
    [Classroom] => array(
        ...teacher data...
    ),
    [Teacher] => array(
        [0] => array(
            [id] => 4
            ....
        ),
        [1] => array( ...teacher 2 data... ),
        [2] => array( ...teacher 3 data... ),
    )
)

然后,您可以直接浏览Teacher数组,并确保相关教师在该数组中。

对于后一项任务,您可能希望使用有用的内置Set实用程序 - 您可以执行以下操作:

$teacherlist = Set::extract($classdata,'/Classroom/id');
if(in_array($teacherlist, $id)) {
    //They're okay
} else {
    //Return an error
}

如果你真的想在模型函数中编写它,请查看find中的join选项 - 它比bindModel更容易。或者查看Habtamable behavior

(重新阅读问题后编辑翻转)