【发布时间】:2017-08-29 10:04:44
【问题描述】:
我了解了here 如何在 CakePHP 3.x 中添加或编辑 student 时将数据保存到连接表 CoursesMemberships 的字段中。为了为许多courses 添加grades,我可以在add 和edit 表单中执行此操作:
echo $this->Form->control('courses.0.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.0._joinData.grade');
echo $this->Form->control('courses.1.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.1._joinData.grade');
echo $this->Form->control('courses.2.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.2._joinData.grade');
...
但是这种形式:
- 每个
student都有固定数量的courses; - 需要从列表中选择
course id('type' => 'select'); - 即使没有参加,也会将所有课程添加到学生记录中(好吧,相应的
grade字段可以保留为空,但仍然如此)。
有没有办法有一个更简单的表格,列出所有courses,并且只能选中course 参加并输入相应的grade?我发现使用control 非常具有挑战性...
编辑:
在@ndm下面提出了一个很不错的方法后,我在add.ctp中实现了:
foreach ($courses as $key => $course) {
echo $this->Form->control('courses.'.$key.'.id', ['type' => 'checkbox', 'hiddenField' => false, 'value' => $key,
'label' => $key]);
echo $this->Form->control('courses.'.$key.'._joinData.grades');
}
并相应地更正了StudentsTable.php。它运行没有问题。
但是,如果我在 edit.ctp 中执行相同操作,则先前保存的记录(例如,对于 1、3、5 和 7 courses 现在列为 1、2 和 3,显示前 3rd 5th 的 grades和第 7 个courses 和表格迫使我检查这三个框。我知道第一条记录消失了,因为我的courses 以id=1 开头(循环中的$key 也是如此)和'courses.0。 id' 因此丢失,但一般问题是beforeMarshal 函数删除的空字段在edit.ctp 表单中不再识别,我找不到编辑student's 记录的合理方法。
【问题讨论】:
标签: mysql cakephp cakephp-3.0 jointable