Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP3-如何手动修补相关数据并保存所有数据?_Php_Cakephp_Cakephp 3.0 - Fatal编程技术网

CakePHP3-如何手动修补相关数据并保存所有数据?

CakePHP3-如何手动修补相关数据并保存所有数据?,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我执行查找以检索一个实体并包含其关联的一个实体,其中有许多实体 检索到的数据简单来说如下所示: object(App\Model\Entity\Order) { 'id' => '67839', 'price' => (int) 100, 'payment_instalments' => [ (int) 0 => object(Cake\ORM\Entity) { 'id' => (int) 431

我执行查找以检索一个实体并包含其关联的一个实体,其中有许多实体

检索到的数据简单来说如下所示:

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\u分期付款
未标记为“脏”,因为它是单独修补的。因此,我找到的唯一解决方案是手动将其标记为脏:

$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
],
分期付款
也需要标记为肮脏。当您正确修补时,应该会自动发生这种情况

当然,在本例中,
0=>
部分是可选的。我把它放在那里是为了更清楚地表明数据在嵌套数组中

它只保存订单本身而不保存关联记录的原因如下:

'[dirty]' => [
    'price' => true
],

分期付款
也需要标记为肮脏。当您正确修补时,应该会自动执行此操作。

相关数据已在嵌套数组中。我能让它工作的唯一方法是手动添加
$order->dirty('payment\u installaments',true)我的更改不是通过表单发布的,我正在手动修改数据,因此,在本例中修补关联实体的正确方法是什么(因为执行查找时它不是数组;它是
分期付款
中的实体数组)。@BadHorsie正确的方法在这里的答案中显示,你就是这么做的。原始属性包含一个实体数组这一事实是不相关的,或者说它实际上是封送员正确修补/合并数据所必需的。@BadHorsie,当您尝试我的代码时,生成的
$order
是什么样子的?请注意,相关记录的
id
包含在传递给
patchEntity
的数据中是至关重要的,因为这是它定位需要修补的实体的方式。@ndm好的,我同意。因此,只需通过以数组格式提供数据来修改实体,封送拆收器就会将其合并到实体中。关联的数据已经在嵌套数组中。我能让它工作的唯一方法是手动添加
$order->dirty('payment\u installaments',true)我的更改不是通过表单发布的,我正在手动修改数据,因此,在本例中修补关联实体的正确方法是什么(因为执行查找时它不是数组;它是
分期付款
中的实体数组)。@BadHorsie正确的方法在这里的答案中显示,你就是这么做的。原始属性包含一个实体数组这一事实是不相关的,或者说它实际上是封送员正确修补/合并数据所必需的。@BadHorsie,当您尝试我的代码时,生成的
$order
是什么样子的?请注意,相关记录的
id
包含在传递给
patchEntity
的数据中是至关重要的,因为这是它定位需要修补的实体的方式。@ndm好的,我同意。因此,只需通过以数组格式提供数据来修改实体,封送拆收器就会将其合并到实体中。