因此,我可能需要将数百行插入到数据库中。没有验证验证数据的唯一性。
但是,在数据库中,3列之间存在约束,组合时必须是唯一的。有时,此唯一性失败,整个保存操作失败。
有没有办法忽略Table::saveMany()
调用中的失败并继续保存所有其他记录?也许稍后会记录错误,但仍然继续保存其余的记录,而不是直接使整个操作失败?
答案 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)
您可以采取几种方法解决此问题。
而不是使用Table::saveMany()
做一个循环,只需使用Table::save()
并记录失败的内容,以便稍后进行调查。
将您的大工作分成小批量。如果您必须说出1,000条记录,请将其分成100个记录批次,并为每个批次使用Table:saveMany()
。这样,当某些事情失败时,只有当前批次失败而不是整个保存过程。
危险类型(以及 NOT 推荐)是覆盖Table::save()
方法,即使无法存储记录也不会失败。