Cakephp 3 - 手动修补和保存相关数据

问题描述 投票:0回答:1

我正在尝试手动更新主记录和关联记录(销售订单及其行项目)。两个表中需要更新的字段恰好是完全相同的字段(Processed、Updated 和 DocEntry),但需要注意关联表的

 WHERE dizOrderID = 1
。主记录更新得很好,但关联记录永远不会被标记为脏记录,因此不会更新。值得庆幸的是,它也没有插入额外的记录。

我查看并使用了herehere的评论。两个表中的所有字段都标记为可访问。

这是我的控制器代码:

$update = $this->dizSales->get($ID, ['contain' => ['dizSalesLines']]);
$upData = ['Processed' => 'Y', 'Updated' => date('Y-m-d H:i:s'), 'DocEntry' => $newRec['DocEntry'], 'dizSalesLines' => ['dizOrderID' => $ID, 'Processed' => 'Y', 'Updated' => date('Y-m-d H:i:s'), 'DocEntry' => $newRec['DocEntry']]];
$update = $this->dizSales->patchEntity($update, $upData, ['associated' => ['dizSalesLines']]);
$update->setDirty('dizSalesLines', true);

这是补丁的调试:

object(App\Model\Entity\DizSale) {

        'ID' => (int) 1,
        'Created' => object(Cake\I18n\FrozenTime) {

                'time' => '2024-01-11 16:20:11.110000-05:00',
                'timezone' => 'America/New_York',
                'fixedNowTime' => false

        },
        'Updated' => object(Cake\I18n\FrozenTime) {

                'time' => '2024-02-09 15:20:48.000000-05:00',
                'timezone' => 'America/New_York',
                'fixedNowTime' => false

        },
        'Processed' => 'Y',
        'Customer_ID' => 'ABC123',
        'ShipTo' => 'Location 123',
        'Street1' => '200 Station Drive',
        'Street2' => null,
        'City' => 'Anderson',
        'State' => 'SC',
        'County' => 'Anderson',
        'ZipCode' => '29621',
        'Country' => 'US',
        'DocEntry' => (int) 113649,
        'Status' => 'O',
        'Canceled' => 'N',
        'CancelDate' => null,
        'diz_sales_lines' => [
                (int) 0 => object(App\Model\Entity\DizSalesLine) {

                        'ID' => (int) 1,
                        'dizOrderID' => (int) 1,
                        'Created' => object(Cake\I18n\FrozenTime) {

                                'time' => '2024-01-11 16:24:33.323000-05:00',
                                'timezone' => 'America/New_York',
                                'fixedNowTime' => false

                        },
                        'Updated' => object(Cake\I18n\FrozenTime) {

                                'time' => '2024-01-11 16:24:33.323000-05:00',
                                'timezone' => 'America/New_York',
                                'fixedNowTime' => false

                        },
                        'Processed' => 'N',
                        'ItemCode' => '6311',
                        'Quantity' => (float) 7,
                        'WhsCode' => '52',
                        'LineStatus' => 'O',
                        'DocEntry' => null,
                        'OpenQty' => null,
                        'TargetEntry' => null,
                        '[new]' => false,
                        '[accessible]' => [
                                'ID' => true,
                                'dizOrderID' => true,
                                'Created' => true,
                                'Updated' => true,
                                'Processed' => true,
                                'ItemCode' => true,
                                'Quantity' => true,
                                'WhsCode' => true,
                                'LineStatus' => true,
                                'DocEntry' => true,
                                'OpenQty' => true,
                                'TargetEntry' => true
                        ],
                        '[dirty]' => [],
                        '[original]' => [],
                        '[virtual]' => [],
                        '[hasErrors]' => false,
                        '[errors]' => [],
                        '[invalid]' => [],
                        '[repository]' => 'DizSalesLines'

                },
                (int) 1 => object(App\Model\Entity\DizSalesLine) {

                        'ID' => (int) 2,
                        'dizOrderID' => (int) 1,
                        'Created' => object(Cake\I18n\FrozenTime) {

                                'time' => '2024-01-11 16:24:33.323000-05:00',
                                'timezone' => 'America/New_York',
                                'fixedNowTime' => false

                        },
                        'Updated' => object(Cake\I18n\FrozenTime) {

                                'time' => '2024-01-11 16:24:33.323000-05:00',
                                'timezone' => 'America/New_York',
                                'fixedNowTime' => false

                        },
                        'Processed' => 'N',
                        'ItemCode' => '5890',
                        'Quantity' => (float) 5,
                        'WhsCode' => '52',
                        'LineStatus' => 'O',
                        'DocEntry' => null,
                        'OpenQty' => null,
                        'TargetEntry' => null,
                        '[new]' => false,
                        '[accessible]' => [
                                'ID' => true,
                                'dizOrderID' => true,
                                'Created' => true,
                                'Updated' => true,
                                'Processed' => true,
                                'ItemCode' => true,
                                'Quantity' => true,
                                'WhsCode' => true,
                                'LineStatus' => true,
                                'DocEntry' => true,
                                'OpenQty' => true,
                                'TargetEntry' => true
                        ],
                        '[dirty]' => [],
                        '[original]' => [],
                        '[virtual]' => [],
                        '[hasErrors]' => false,
                        '[errors]' => [],
                        '[invalid]' => [],
                        '[repository]' => 'DizSalesLines'

                }
        ],
        '[new]' => false,
        '[accessible]' => [
                'ID' => true,
                'Created' => true,
                'Updated' => true,
                'Processed' => true,
                'Customer_ID' => true,
                'ShipTo' => true,
                'Street1' => true,
                'Street2' => true,
                'City' => true,
                'State' => true,
                'County' => true,
                'ZipCode' => true,
                'Country' => true,
                'DocEntry' => true,
                'Status' => true,
                'Canceled' => true,
                'CancelDate' => true
        ],
        '[dirty]' => [
                'Processed' => true,
                'Updated' => true,
                'DocEntry' => true,
                'DizSalesLines' => true
        ],
        '[original]' => [
                'Processed' => 'N',
                'Updated' => object(Cake\I18n\FrozenTime) {

                        'time' => '2024-01-11 16:20:11.110000-05:00',
                        'timezone' => 'America/New_York',
                        'fixedNowTime' => false

                },
                'DocEntry' => null
        ],
        '[virtual]' => [],
        '[hasErrors]' => false,
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'DizSales'

}

我看到补丁已拾取主表的“脏”,但关联表没有,并且我正在为关联设置脏(我想我是)。我在 patchEntity 之前和之后调用了 setDirty() ,没有任何区别。

我很困惑,我知道答案可能就在我面前,但我想我已经看这个太久了。

TIA 提供所有帮助。我很感激。

cakephp cakephp-3.x
1个回答
0
投票

你的数据结构应该是这样的:

$upData = [
    'Processed' => 'Y',
    'Updated' => date('Y-m-d H:i:s'),
    'DocEntry' => $newRec['DocEntry'],
    'dizSalesLines' => [
        [
            'id' => 1,
            'dizOrderID' => $ID,
            'Processed' => 'Y',
            'Updated' => date('Y-m-d H:i:s'),
            'DocEntry' => $newRec['DocEntry']
        ],
        [
            'id' => 2,
            'dizOrderID' => $ID,
            'Processed' => 'Y',
            'Updated' => date('Y-m-d H:i:s'),
            'DocEntry' => $newRec['DocEntry']
        ],
    ]
];
© www.soinside.com 2019 - 2024. All rights reserved.