簡體   English   中英

CakePHP 3-如何手動修補關聯數據並保存所有數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM