Сохранение hasMany всегда добавляет запись вместо обновления

у меня есть hasMany отношения (скажем Post имеет много Comments)

Я хочу редактировать оба Post и существующий Comment в то же время

Мой код

в моем комментарии edit.ctp файл, который я сделал

<?= $this->Form->create($post); ?>
<?= $this->Form->input('title'); ?>
<?= $this->Form->input('title');  ?>
<?= $this->Form->input('text'); ?>
<?= $this->Form->input('comments.0.id'); ?>
<?= $this->Form->input('comments.0.text'); ?>

и в моем PostsController

$post= $this->Posts->get($id);
$post= $this->Posts->patchEntity($post, $this->request->data, ['associated' => ['Comments']]);

Моя проблема

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

Что я делал

Я пытался отлаживать $this->request->data и я получил

[
'text' => 'This is a test',
'comments' => [
(int) 0 => [
'id' => '168',
'text' => 'Comment test',

]
]
]

но если я отлаживаю $post я получил

object(App\Model\Entity\Post) {

/* ... */
'comments' => [
(int) 0 => object(App\Model\Entity\Comment) {

'text' => 'Comment test',
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'text' => true
],
/* ... */

}
],
/* ... */
'[dirty]' => [
'comments' => true,
],

}

Так почему комментарий помечается как «новый», когда я передаю его id к контроллеру?

Конечно, это упрощенная версия моей реальной ситуации. Возможно проблема не в приведенном выше коде, и я должен искать в другом месте в моем другом коде.

Мой вопрос здесь, если я делаю некоторые основные ошибки подхода.

1

Решение

Вам необходимо прочитать связанные данные в вашу сущность, чтобы иметь возможность их исправлять, иначе данные не будут объединены, а просто упорядочены и, таким образом, будут обработаны как «новые».

Автоматическая загрузка связанных данных происходит только для специальных _ids ключ, и когда есть хотя бы одна запись в свойстве ассоциации, то есть на самом деле вам не нужно загружать связанные данные, которые вы хотите исправить, но должно быть что-то для того, чтобы маршаллер достиг точки, где данные читаются и объединяются.

Чтобы быть точным, без каких-либо данных в comments собственность, маршаллер выйдет здесь

https://github.com/cakephp/cakephp/blob/3.2.8/src/ORM/Marshaller.php#L653-L655

Я не могу точно сказать, может ли быть ошибка, по крайней мере, я думаю, что документы должны быть обновлены вокруг этого, поскольку они будут немного вводить в заблуждение. Хотя они пытаются объяснить, что происходит, когда в исходной сущности отсутствуют связанные данные, показанный пример в настоящее время не работает, и они говорят, что новые сущности будут созданы только для belongsTo а также hasOne ассоциации, что неверно.

Поваренная книга> Доступ к базе данных & ORM> Сохранение данных> Исправления HasMany и BelongsToMany

Вы можете подать проблему на GitHub для разъяснения.

Короче говоря, содержать комментарии, и вы должны быть хорошими.

$post = $this->Posts->get($id, [
'contain' => ['Comments']
]);
// ...
2

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

Других решений пока нет …

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