[英]CakePHP 3 - How do you patch associated data manually, and save all?
我執行查找以檢索一個實體並包含其關聯的實體之一,該實體具有hasMany。
檢索到的數據看起來很簡單:
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);
然后保存將起作用。
這對我來說似乎很混亂,如果我必須修補多個包含的實體,它將變得更加混亂。 我找不到任何文檔或任何有關如何正確/優雅地完成此操作的幫助。
有沒有一種方法可以一次修改主實體和包含的實體,並使其自動識別包含的數據是臟的?
$order = $orders->patchEntity($order, [
'price' => 123, // Change data on the order itself
'payment_instalments' => [
0 => [
'id' => 43150,
'amount' => 123,
]
]
]);
當然,在這種情況下, 0 =>
部分是可選的。 我將其放置在其中以使其更清楚地表明數據位於嵌套數組中。
它只保存訂單本身而不保存相關記錄的原因如下:
'[dirty]' => [
'price' => true
],
payment_instalments
需要標記為臟。 正確修補后,應該會自動發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.