Сохранение дополнительных данных в таблицу соединений в методе add в CakePHP 3.0

В этом примере из книги:

https://book.cakephp.org/3.0/en/orm/associations.html#using-the-through-option

class StudentsTable extends Table
{
public function initialize(array $config)
{
$this->belongsToMany('Courses', [
'through' => 'CoursesMemberships',
]);
}
}

class CoursesTable extends Table
{
public function initialize(array $config)
{
$this->belongsToMany('Students', [
'through' => 'CoursesMemberships',
]);
}
}

class CoursesMembershipsTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Students');
$this->belongsTo('Courses');
}
}

Я хочу войти grade соответствует курсу № 8 при добавлении нового student, Я следую этим двум примерам:

https://book.cakephp.org/3.0/en/orm/saving-data.html#saving-belongstomany-associations

а также

https://book.cakephp.org/3.0/en/views/helpers/form.html#associated-form-inputs

и изменить add метод в StudentsController.php

public function add()
{

$student = $this->Students->newEntity();
if ($this->request->is('post')) {
$student = $this->Students->patchEntity($user, $this->request->getData(), [
'associated' => [
'Courses']]);if ($this->Students->save($student,['associated' => ['Courses._joinData']])) {
$this->Flash->success(__('The student has been saved.'));

return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The student could not be saved. Please, try again.'));
}
$courses = $this->Students->Courses->find('list', ['limit' => 200]);
$this->set(compact('student', 'courses'));
$this->set('_serialize', ['student']);
}

а также Students/add.ctp иметь

echo $this->Form->control('courses._ids', ['options' => $courses]);
echo $this->Form->control('courses.5._joinData.grade');

Когда я выбираю курс № 8 в виде и ввожу соответствующую оценку, я не вижу его в CoursesMemberships Таблица. Он добавляет саму запись, но grade не там.

0

Решение

Вы не можете смешивать специальные _ids синтаксис и традиционный синтаксис для выражения вложенных структур данных, т.е. property.index.field... (примечание в документации об этом поведении, вероятно, не повредит).

Также добавление данных в индекс 5 кажется очень произвольным, вы добавляете новую ссылку / запись, поэтому вы обычно начинаете с 0,

Угробить _ids синтаксис и построить правильный набор данных курса, явно определив его первичный ключ, например:

echo $this->Form->control('courses.0.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.0._joinData.grade');

Смотрите также

1

Другие решения

Сначала я не вижу $ course в вашей функции add …

Может быть, если вы измените sitems на $ курсы

$ пункты = $ this-> Students-> Courses-> find (‘list’, [‘limit’ => 200]);

или по вашему мнению:

echo $this->Form->control('courses._ids', ['options' => $items]);
0

По вопросам рекламы [email protected]