【问题标题】:Why do conditions in model associations not filter the find results in the controller in CakePHP?为什么模型关联中的条件不过滤 CakePHP 控制器中的查找结果?
【发布时间】:2014-10-19 03:06:05
【问题描述】:

我有两个模型: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 部分中设置的条件不过滤结果以仅显示Usersgroup_id 为2 即Teachers?如果这不是它应该工作的方式,那么在这里设置条件的意义何在?

    到目前为止,我每次都必须将其包含在 find 中,这似乎有点多余:$teachers = $this->Lesson->Teacher->find('list', array('conditions'=>array('Teacher.group_id'=>'2')))

  2. 如何编写Students 的关联,以便Lessons 有很多学生?以及如何为其设置数据库?

【问题讨论】:

  • 关于您问题的数据库部分:您需要分享您当前的表 (用户、教师、学生、课程、users_teachers 等) (至少) 那些表的主键和外键。您的问题令人困惑,因为由于使用了 Cakephp 术语,“用户有一位老师”这句话暗示了 2 个表格。但是,您在 Lesson 模型中的 belongsTo 关系将 Teachers 描述为 User 表的子集。

标签: cakephp cakephp-2.5


【解决方案1】:

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 的用户。

【讨论】:

  • 1) 将条件更改为使用模型名称而不是别名会导致 sql 错误(据我了解,CakePHP 在查询中使用别名?) 2) 这如何帮助我访问课程模型中的学生
  • 1) 我不确定这个,但我认为你不能在那里使用别名,因为这是你定义别名开始的地方和! 2) 如果您之前没有将相同的关联(更改字段名称 ofc)添加到您的 lesson 模型中,然后对两个模型使用可包含行为来查找您的数据.检查这个question on similar matter.
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多