尝试设置如何使用连接表和额外数据的示例我有以下设置:
students
:id
,name
,[...] courses
:id
,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]
学生记录中的在学生表和关联表中创建记录。
如何形成帖子数据阵列,以便在保存学生记录时能够在关联表中存储grade
和hours_attended
字段?
答案 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']]);
这会将您关联的请求数据合并到您的实体中,这样您就可以保存它。