如何在一次保存多个实体时允许失败?

时间:2018-05-16 08:46:03

标签: cakephp orm cakephp-3.0

因此,我可能需要将数百行插入到数据库中。没有验证验证数据的唯一性。

但是,在数据库中,3列之间存在约束,组合时必须是唯一的。有时,此唯一性失败,整个保存操作失败。

有没有办法忽略Table::saveMany()调用中的失败并继续保存所有其他记录?也许稍后会记录错误,但仍然继续保存其余的记录,而不是直接使整个操作失败?

2 个答案:

答案 0 :(得分:1)

不,没有,请查看API描述和Table::saveMany()的源代码,它只是将所有实体保存在循环中,以阻止和回滚事务{ {1}}失败。

  

记录将保存在一个事务中,如果由于验证失败或数据库错误而导致任何一个记录无法保存,则该事务将被回滚。

<强> https://api.cakephp.org/3.6/class-Cake.ORM.Table.html#_saveMany

如果您想允许失败,那么您必须自己处理,保存每条记录,捕获可能的异常,并检查保存操作结果。这是一个快速的&amp;脏示例,其中Table::save()是要保存的表,$table是一组实体:

$entities

另见

答案 1 :(得分:1)

您可以采取几种方法解决此问题。

  1. 而不是使用Table::saveMany()做一个循环,只需使用Table::save()并记录失败的内容,以便稍后进行调查。

  2. 将您的大工作分成小批量。如果您必须说出1,000条记录,请将其分成100个记录批次,并为每个批次使用Table:saveMany()。这样,当某些事情失败时,只有当前批次失败而不是整个保存过程。

  3. 危险类型(以及 NOT 推荐)是覆盖Table::save()方法,即使无法存储记录也不会失败。