【问题标题】:CakePHP 3 - How do you patch associated data manually, and save all?CakePHP 3 - 如何手动修补关联数据并保存所有数据?
【发布时间】:2017-01-27 20:52:41
【问题描述】:

我执行查找以检索一个实体并包含其关联实体之一,其中它有很多。

检索到的数据简单来说是这样的:

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);

然后保存将起作用。

这对我来说似乎很混乱,如果我必须修补多个包含的实体,会变得更加混乱。我在任何地方都找不到有关如何正确/优雅地完成此操作的任何文档或帮助。

有没有办法一次性修改主实体和包含的实体,并让它自动识别包含的数据是脏的?

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:
    $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 也需要标记为脏。当您正确修补时,这应该会自动发生。

    【讨论】:

    • 关联数据已经在嵌套数组中。我可以让它工作的唯一方法是手动添加$order->dirty('payment_instalments', true); 我的更改不是通过表单发布的,我正在手动修改数据,那么在这种情况下修补关联实体的正确方法是什么(因为它是执行查找时不是数组;它是payment_instalments 中的实体数组。
    • @BadHorsie 答案中显示了正确的方法,这正是你要做的。原始属性包含实体数组的事实是无关紧要的,或者我们更好地说它实际上是编组器能够正确修补/合并数据所必需的。
    • @BadHorsie,当您尝试我的代码时,生成的$order 是什么样的?请注意,相关记录的id 必须包含在您传递给patchEntity 的数据中,因为这就是它找到需要修补的实体的方式。
    • @ndm 好的,我支持你。所以只需通过提供数组格式的数据来修改实体,编组器会将其合并到实体中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多