у меня есть 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
к контроллеру?
Конечно, это упрощенная версия моей реальной ситуации. Возможно проблема не в приведенном выше коде, и я должен искать в другом месте в моем другом коде.
Мой вопрос здесь, если я делаю некоторые основные ошибки подхода.
Вам необходимо прочитать связанные данные в вашу сущность, чтобы иметь возможность их исправлять, иначе данные не будут объединены, а просто упорядочены и, таким образом, будут обработаны как «новые».
Автоматическая загрузка связанных данных происходит только для специальных _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']
]);
// ...
Других решений пока нет …