Сохранение данных ассоциаций HasMany в CakePHP 3.x

У меня есть два стола. Моя основная таблица Ученики. И моя дополнительная таблица Экзамены. Я пытаюсь сохранить обе таблицы, используя имеет много а также belongsToMany Ассоциация. Но это сохранение данных в Ученик только стол, а не в Экзамены. Может ли кто-нибудь помочь мне решить эту проблему.

Модель для студентов:

class StudentsTable extends Table {
public function initialize(array $config) {
$this->addBehavior('Timestamp');
parent::initialize($config);
$this->table('students');
$this->primaryKey(['id']);
$this->hasMany('Exams', [
'className' => 'Exams',
'foreignKey' => 'student_id',
'dependent'=>'true',
'cascadeCallbacks'=>'true']);
}
}

Модель экзаменов:

class ExamsTable extends Table {
public function initialize(array $config) {
parent::initialize($config);
$this->table('exams');
$this->primaryKey(['id']);
$this->belongsToMany('Students',[
'className'=>'Students',
'foreignKey' => 'subject_id',
'dependent'=>'true',
'cascadeCallbacks'=>'true']);
}
}

Моя школа.ctp:

echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->input('exams.subject', array(
'required'=>false,
'multiple' => 'checkbox',
'options' => array(
0 => 'Tamil',
1 => 'English',
2 => 'Maths')));
echo $this->Form->button(__('Save'));
echo $this->Form->end();

В моем контроллере:

public function school() {
$this->loadModel('Students');
$this->loadModel('Exams');
$student = $this->Students->newEntity();
if ($this->request->is('post')) {
$this->request->data['exams']['subject'] =
implode(',',$this->request->data['exams']['subject']);
$student = $this->Students->patchEntity(
$student, $this->request->data, ['associated' => ['Exams']]
);
if ($this->Students->save($student)) {
$this->Flash->success(__('The user has been saved.'));
} else {
$this->Flash->error(__('Unable to add the user.'));
}
}
}

5

Решение

Ямочный ремонт принадлежит многим ассоциациям

Вы должны убедиться, что вы можете назначить экзамены. Установите availableFields, чтобы позволить вам исправлять связанные данные

$student = $this->Students->patchEntity(
$student, $this->request->data, [
'associated' => ['Exams'],
'accessibleFields' => ['exams' => true]
]
);

Вы также можете сделать это с помощью свойства $ _accessible в объекте.

0

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

Я никогда не делал hasMany, чтобы принадлежать ToMany, потому что я не думаю, что это работает таким образом (я не имею в виду никакого вреда в моих словах.) Но я попытаюсь объяснить. Ваши отношения должны быть оба принадлежат ToMany, потому что на экзаменах будет много студентов, а у студентов будет много экзаменов. Так что в основном они одинаковы в любом случае. Вам нужна еще одна таблица для их соединения, которая будет называться students_exams или же exams_students (я думаю, что его exams_students, потому что E предшествует S), потому что в торт, если вы все правильно называете, большинство из них происходит автоматически.

Предполагая, что вы знаете, как patchEntity работает, создавая свой $this->request->data правильно исправит это автоматически и сохранит это в правильной таблице, когда Вы сохраните это. Если у вас есть еще вопросы, не стесняйтесь спрашивать больше. 🙂

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector