我学会了here在CakePHP 3.x中添加或编辑student
时,如何将数据保存到连接表CoursesMemberships
的字段。为了增加grades
许多courses
我可以在我的add
和edit
形式做到这一点:使用CakePHP 3.x中的控制选项将数据保存到连接表
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显示grades
为前3日第5和第7 courses
和我知道第一个记录消失了,因为我的courses
以id=1
(循环中的$键也是这样)开头,因此'courses.0.id'缺失,但一般问题是通过beforeMarshal
函数删除空字段edit.ctp
形式不再是公认的,我无法找到一个合理的方式来编辑student's
记录。
我非常感谢你的优雅的解决方案和详细的解释!我开始实现第一个并得到这个错误消息:不能使用Cake \ ORM \ Query类型的对象作为数组(行'value'=> $ courses [0] - > id) –
您必须将其转换首先使用'$ courses-> toArray()'来创建一个数组,而'$ courses'需要是一个常规查询(而不是一个列表)。我假设你想给你的示例代码片段生成特定数量的课程。或者,您可以遍历'$ courses',并且在'$ courses'是列表查找器查询的情况下使用键/值而不是访问属性。 – ndm
令人惊叹!一切正如你所解释的那样。一如既往。非常感谢! –