为什么模型关联中的条件不会过滤CakePHP中控制器中的查找结果?

时间:2014-10-19 03:06:05

标签: cakephp cakephp-2.5

我有两个模型:UsersLessons

  • User有一个Teacher
  • User拥有并属于许多Students

TeachersStudents都是Users

在我的Users模型中,我有这种关联:

public $hasMany = array(
    'Lesson' => array(
        'className' => 'Lesson',
        'foreignKey' => 'user_id',
        'dependent' => false,
    )
);

在我的Lessons模型中,我目前有这种关联:

public $belongsTo = array(
    'Teacher' => array(
        'className' => 'User',
        'foreignKey' => 'teacher_id',
        'conditions' => array('Teacher.group_id' => '2'),
        'fields' => '',
        'order' => ''
    )
);

我的问题是:

  1. 为什么$teachers = $this->Lesson->Teacher->find('list');会返回所有users而不只是teachers?为什么不在模型belongsTo部分设置的条件过滤结果,只显示Users的{​​{1}}为2,即group_id?如果这不是它应该工作的方式,那么在这里设置条件的重点是什么?

    截至目前,我必须每次都将其包含在查找中,这似乎有点多余:Teachers

  2. 如何撰写$teachers = $this->Lesson->Teacher->find('list', array('conditions'=>array('Teacher.group_id'=>'2')))的关联,以便Students有很多学生?我如何为它设置数据库?

1 个答案:

答案 0 :(得分:0)

1。您的关联中的条件应更改为包含模型的名称而不是别名:

'conditions' => array('User.group_id' => 2),

2。该关联应为hasAndBelongsToMany (HABTM),并且可以在User模型中定义,如下所示:

public $hasAndBelongsToMany = array(
    'Lessons' => array(
        'className' => 'Lesson',
        'joinTable' => 'lessons_users', // or the name from DB
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'lesson_id',
        'unique' => 'keepExisting' // Set this based on your needs, check link above
    )
);

鉴于上述关联,您需要在数据库中使用新表lessons_users来存储学生与课程之间关系的数据:

          +++++++++++++++++++++++++++++++++++++++++++++++++
          +  id (pk)  +  lesson_id (fk)  +  user_id (fk)  +
          +++++++++++++++++++++++++++++++++++++++++++++++++
          +     1     +         1        +        1       +
          +-----------+------------------+----------------+
          +     2     +         1        +        2       +
          +-----------+------------------+----------------+
          +     3     +         2        +        1       +
          +-----------+------------------+----------------+
          +     4     +         2        +        2       +
          +++++++++++++++++++++++++++++++++++++++++++++++++

从上面的例子中; id为1的用户正在上课1& 2,id为2的用户正在上课1& 2也是。同样,id为1的课程的用户有ID 1& 2已注册,而带有ID 2的课程的用户有ID 1& 2也注册了。