【问题标题】:Complex Associations - CakePHP 3.x [ Nested belongsToMany]复杂关联 - CakePHP 3.x [嵌套的 belongsToMany]
【发布时间】:2017-08-21 05:41:57
【问题描述】:

我有一个复杂的加入,比如

A 属于 Many B throw AB table AB属于多C扔ABC表

现在我的问题是如何在控制器 A 中获取包含结果的数据,直到表 ABC。 在 A 和表 ABC 中找不到直接关系

我的数据库结构是

表 A(ID、名称、代码) 表 B(ID、名称、代码) 表 C(ID、名称、代码) 表 AB(id、a_id、b_id、费用) 表 ABC (ab_id, c_id, opt_date, tno)

我可以使用以下查询与 B 连接,但不确定如何获取 ABC 的数据

    $this->A->find('list',[
contain => ['B']
    ]);

这里我把它改成我的真实方案

1. courses (id, name, course_code, etc...)
2. sessions (id, name, status, start_date, end_date)
3. seats (id, name, description, metadata, status)
4. courses_sessions (id, course_id, session_id, programme_coordinator, academic_coordinator, status)
5. courses_sessions_seats (id, courses_session_id, seats_id, no_seats)

目前的关系

a) courses belongsToMany sessions using courses_sessions
b) courses_sessions belongsToMany seats using courses_sessions_seats

我不知道情况二是否可行,但我想要显示课程详细信息以及每个类别会话的可用座位。

【问题讨论】:

  • 搜索列表只返回两个字段 - 主键字段和显示字段为数组 [primary_key => display_field] 不会选择其他字段。
  • book.cakephp.org/3.0/en/orm/… 是要在文档中查看的内容

标签: php cakephp-3.0 has-and-belongs-to-many


【解决方案1】:

简而言之,它可能看起来像这样

$this->A
    ->find()
    ->contain([
      'B' => ['C']
      ]);

$this->A
    ->find()
    ->contain([
      'B' => function($q) {
         return $q->contain(['C']);    
      }]);

你可以阅读它here in docs

编辑

我对表架构的看法

  1. courses_sessions
    • course_sessions 属于课程
    • course_sessions 属于会话
  2. courses_sessions_seats
    • courses_sessions_seats 属于 course_sessions
    • courses_sessions_seats 属于座位

如果你用这种方式制作模型,你以后可以更好地控制查询。

EDIT2

从您使用的课​​程案例的角度获取所有数据

$courses = $this->Courses
  ->find()
  ->contain([
    'CoursesSessions' => ['Sessions', 'SessionsSeats']
  ]);
foreach ($courses as $course) :
  // Your code here
endforeach;

就这么简单

【讨论】:

  • 朋友这不是我的条件。它与它不同。 AbelongsToMany B 使用 AB(Joined Table)和 AB(Joined Table)belongsToMany C 使用 ABC table。
  • 感谢您的重播。像 Courses belongsToMany Session 一样使用 CoursesSession 表。现在在每个会话中,每个类别的席位都不同。所以现在 CoursesSession 属于ToMany Categories 使用 CategoryCoursesSession 表(使用 CoursesSession 表的主键)。希望现在你得到正确的情况。
  • 如果您的数据库中有这种复杂的扭曲,您可以(并且恕我直言应该)将其简化为 hasMany 和 belongsTo 结构。它会更容易维护。并将问题更新为您的真实架构或花足够的时间使其易于理解。
  • 我用真实案例和当前架构和要求更改了问题
  • 是的,它的设计方式相同。如果需要任何更改或如何获取最终数据,请让我知道我在哪里获得课程详细信息,直到座位分配会话明智
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多