1

尝试设置一个关于如何使用带有额外数据的连接表的示例,我有以下设置:

  • studentsid,,name[...]
  • coursesid,,title[...]
  • 连接表courses_students: id, course_id, student_id, grade,hours_attended

两个基表:

class StudentsTable extends Table {
  public function initialize(array $config) {
    $this->belongsToMany('Courses', [
        'alias' => 'Courses',
        'foreignKey' => 'student_id',
        'targetForeignKey' => 'course_id',
        'joinTable' => 'courses_students',
        'through' => 'CoursesStudents',     
    ]);
}

class CoursesTable extends Table {
  public function initialize(array $config) {
    $this->belongsToMany('Students', [
        'alias' => 'Students',
        'foreignKey' => 'course_id',
        'targetForeignKey' => 'student_id',
        'joinTable' => 'courses_students',
        'through' => 'CoursesStudents',
    ]);
}

和关联表:

class CoursesStudentsTable extends Table {
  public function initialize(array $config) {
    $this->belongsTo('Courses', [
        'alias' => 'Courses',
        'foreignKey' => 'course_id'
    ]);
    $this->belongsTo('Students', [
        'alias' => 'Students',
        'foreignKey' => 'student_id'
    ]);
}

在表中有一些课程可用时,我尝试添加和编辑学生记录。环境

[courses] => [_ids]

在学生记录中创建学生表和关联表中的记录。

应该如何形成post数据数组,以便在保存学生记录时能够将gradehours_attended字段存储在关联表中?

4

1 回答 1

1

假设您在 Courses 表单中,您应该将表单字段配置为如下所示。

echo $this->Form->create($courses);
echo $this->Form->input("Courses.id");
echo $this->Form->input("Courses.title");
echo $this->Form->input("Courses.courses_students.$i.grade");
echo $this->Form->input("Courses.courses_students.$i.hours_attended");

基本思想是您的表单应该完全遵循在控制器中检索数据时的格式。

然后,这将为您正确格式化您的数据。

然后在您的控制器中,您需要传递关联来修补您的实体。

$courses = $this->Courses->patchEntity($this->request->data(), ['associations' => ['CoursesStudents']]);

这会将您的关联请求数据合并到您的实体中,以便您保存它。

于 2014-12-16T14:34:32.123 回答