Я выполняю поиск, чтобы получить один объект и содержать один из связанных с ним объектов, которых у него много.
Полученные данные выглядят следующим образом:
object(App\Model\Entity\Order) {
'id' => '67839',
'price' => (int) 100,
'payment_instalments' => [
(int) 0 => object(Cake\ORM\Entity) {
'id' => (int) 43150,
'order_id' => '67839',
'amount' => (int) 100
}
]
}
Я хочу вручную изменить поля в основном объекте и поля вложенного объекта.
Я могу легко изменить основной объект следующим образом:
$order = $orders->patchEntity($order, [
'price' => 200
]);
Единственный способ изменить содержащийся объект, который я смог найти, — это выполнить для него отдельный патч. Это можно сделать любым количеством способов. Вот один:
$instalments = TableRegistry::get('PaymentInstalments');
$instalment = $order->payment_instalments[0];
$order->payment_instalments[0] = $instalments->patchEntity(instalment , [
'amount' => 200
]);
Затем я хочу сохранить все:
$orders->save($order, ['associated' => 'PaymentInstalments']);
Проблема заключается в том, что связанные данные не сохраняются, и причина в том, что $order->payment_instalments
не помечается как "грязный", поскольку он был исправлен отдельно. Поэтому единственное решение, которое я нашел, — вручную пометить его как грязное:
$order->dirty('payment_instalments', true);
Тогда сейв сработает.
Мне это кажется довольно запутанным, и было бы намного запутаннее, если бы мне пришлось исправлять несколько содержащихся объектов. Я нигде не мог найти никакой документации или помощи о том, как это должно быть сделано правильно/элегантно.
Есть ли способ изменить как основной объект, так и содержащиеся объекты за один раз, чтобы он автоматически распознавал, что содержащиеся данные грязные?