我有两个模型:Users
和Lessons
User
有一个Teacher
User
拥有并属于许多Students
Teachers
和Students
都是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' => ''
)
);
我的问题是:
为什么$teachers = $this->Lesson->Teacher->find('list');
会返回所有users
而不只是teachers
?为什么不在模型belongsTo
部分设置的条件过滤结果,只显示Users
的{{1}}为2,即group_id
?如果这不是它应该工作的方式,那么在这里设置条件的重点是什么?
截至目前,我必须每次都将其包含在查找中,这似乎有点多余:Teachers
$teachers = $this->Lesson->Teacher->find('list', array('conditions'=>array('Teacher.group_id'=>'2')))
的关联,以便Students
有很多学生?我如何为它设置数据库?答案 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也注册了。