Cakephp 3,在关联表上保存表单数据

时间:2014-12-07 18:04:00

标签: cakephp jointable cakephp-3.0

尝试设置如何使用连接表和额外数据的示例我有以下设置:

  • studentsidname,[...]
  • coursesidtitle,[...]
  • 加入表courses_studentsidcourse_idstudent_idgradehours_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]
学生记录中的

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

如何形成帖子数据阵列,以便在保存学生记录时能够在关联表中存储gradehours_attended字段?

1 个答案:

答案 0 :(得分:1)

如果您在课程表单中,则应将表单字段配置为以下内容。

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']]);

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