我學會了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
令人驚歎!一切正如你所解釋的那樣。一如既往。非常感謝! –