Orm 新建实体和修补实体同时cakephp3

Orm 新建实体和修补实体同时cakephp3,orm,cakephp-3.x,Orm,Cakephp 3.x,我想立即保存和更新数据。在许多功能中 我有这样的数据 [ [ 'id'=>1, 'name' => 'test1' ], [ 'name' => 'test2' ] ] 如果有id,那么我需要更新记录。否则我需要添加记录。如何在cakephp 3中实现这一点。是的,如果您以相同的方式在post请求中接收数据,或者以相同的方式在数组中设置数据,那么它将起作用 $data=[ [ 'id'=>1, 'name

我想立即保存和更新数据。在许多功能中

我有这样的数据

[
  [ 
    'id'=>1,
    'name' => 'test1' 
  ],
  [
    'name' => 'test2'
  ]
]

如果有id,那么我需要更新记录。否则我需要添加记录。如何在cakephp 3中实现这一点。

是的,如果您以相同的方式在post请求中接收数据,或者以相同的方式在数组中设置数据,那么它将起作用

$data=[
  [ 
    'id'=>1,
    'name' => 'test1' 
  ],
  [
    'name' => 'test2'
  ]
];
// In a controller.
$articles = TableRegistry::get('Articles');
$entities = $articles->newEntities($data);

// if you want to follow transaction manner
$articles->connection()->transactional(function () use ($articles, $entities) {
    foreach ($entities as $entity) {
        $articles->save($entity, ['atomic' => false]);
    }
});

// without transaction manner
foreach ($entities as $entity) {
    $articles->save($entity);
}

这在大多数情况下都不起作用,因为通常不允许封送主键,
newEntities()
只会合并数据,而不会合并数据,这意味着主键将被忽略,剩下的将是没有主键的所有新(未持久化)实体,只会导致插入。此外,验证可能无法正常工作,因为它将在“新建”模式下应用,而不是在“更新”模式下应用,甚至在允许编组主键时也适用。长话短说,首先读取实体,然后修补它们。修补时,没有主键的数据集将作为新实体添加。