我正在尝试手动更新主记录和关联记录(销售订单及其行项目)。两个表中需要更新的字段恰好是完全相同的字段(Processed、Updated 和 DocEntry),但需要注意关联表的
WHERE dizOrderID = 1
。主记录更新得很好,但关联记录永远不会被标记为脏记录,因此不会更新。值得庆幸的是,它也没有插入额外的记录。
我查看并使用了here和here的评论。两个表中的所有字段都标记为可访问。
这是我的控制器代码:
$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 提供所有帮助。我很感激。
你的数据结构应该是这样的:
$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']
],
]
];