Как вставить новую запись в связанную таблицу belongsTo вместо редактирования связанной

#cakephp #cakephp-3.0

#cakephp #cakephp-3.0

Вопрос:

В шаблоне редактирования я создал 2 формы. Первая форма для редактирования записи из ‘Table1’ и вторая форма для добавления записи в связанную таблицу ‘Table2’ (принадлежит). Я не хочу редактировать связанную запись, но добавляю новую в Table2 и меняю ключ привязки записи с ‘Table1’.

В контроллере я использую patchEntity(), но таким образом редактируется исходная связанная запись в ‘Table2’.

Код для второй формы выглядит следующим образом.

     <?= $this->Form->create($machine, ['url' => ['action' => 'edit_foto']]);?>
    <?= $this->Form->controls([
            'id' => ['type' => 'hidden'],
            'foto.omschrijving' => [
                'type' => 'text',
                'label' => __('naam van de machine'),
                'value' => $result->type_machine
            ], []);?>

    <?= $this->Form->button(__('save'), ['type' => 'submit']); ?>
    <?= $this->Form->end(); ?>
  

В контроллере для ‘Table1’ я использую что-то вроде этого.

 public function editFoto($id) {

    $data = $this->getRequest()->getData();
    $machine = $this->Machines->get($id, [
        'contain' => [
            'Foto'
        ]
    ]);

    if ($this->request->is([
                'patch',
                'post',
                'put'
            ])) {

        $machine = $this->Machines->patchEntity($machine, $data);
        if ($this->Machines->save($machine)) {
            $this->Flash->success(__('Machine {naam} has been saved.', [
                'naam' => $machine['naam']
            ]));
            return $this->redirect(['action' => 'edit', $id]);
        }
    }

}
  

Как я могу запретить контроллеру редактировать исходную запись и вместо этого принудительно добавить новую запись в ‘Table2’ и изменить ключ привязки в ‘Table1’?

Помощь очень ценится.

добавлена информация: данные, отправляемые формой, выглядят следующим образом:

 [
    'id' => '87',
    'foto' => [
        'omschrijving' => 'WAKER 135 - ter - testje',
        'foto' => [
            'tmp_name' => 'C:xampptmpphp6CFD.tmp',
            'error' => (int) 0,
            'name' => 'MAKITA DTD153RTJ accuschroevendraaier.jpg',
            'type' => 'image/jpeg',
            'size' => (int) 188971
        ],
        'dir_id' => '5c9dd428cc4ef'
    ]
]
  

Ответ №1:

Вместо

 $machine = $this->Machines->patchEntity($machine, $data);
$this->Machines->save($machine);
  

вы должны использовать

 $machine = $this->Machines->newEntity($data, [
  'associated' => ['Fotos']
]);
$this->Machines->save($machine);
  

чтобы сохранить данные. Если связи между Table1 и Table2 верны в моделях, это также обновит ключи привязки.

Убедитесь, что формат идентификаторов в FormHelper правильный. Смотрите документы, как обрабатывать сохранение с помощью ассоциаций. Вы можете увидеть это в $data . При отправке формы $data должна быть в следующем формате:

 $data = [
  'id' => '...',
  'foto' => [
    // ... model data
  ],
];
  

Комментарии:

1. Затем я получаю сообщение об ошибке: «Аргумент 1, переданный Cake ORM Marshaller::one(), должен иметь тип array, object given, вызываемый в C:xampphtdocsmyKMGvendorcakephpcakephpsrcORMTable.php в строке 2631 и определено [COREsrcORMMarshaller.php, строка 168]»

2. Я обновил свой ответ. Может быть, вы использовали $machine вместо $data в качестве параметра?

3. Tanx, $data сохраняется как новая запись, но binding_key не изменился. Вот мой код в модели: «$this-> belongsTo(‘Foto’, [ ‘className’ => ‘Fotos’, ForeignKey’ => ‘foto_id’ ]);», если это может вам помочь.

4. Я обновил свой ответ. Вы можете использовать associated параметр при создании объекта. Кроме того, пожалуйста, проверьте формат $data . Метод save() автоматически обработает ассоциации, если формат правильный.

5. С соответствующим параметром или без него выполняется то же самое. Когда я отлаживаю оба сохраненных значения $machines->foto->id и $machines->foto_id , я получаю правильное новое значение. Похоже, что данные в перенаправленном действии не обновляются. После успешного сохранения она должна перенаправить на основную form1 (действие = редактировать) и перезагрузить измененную запись (компьютер) с новой фотографией, не так ли?