Symfony 为什么在提取时Doctrine会返回一个键中有间隙的关联数组?

Symfony 为什么在提取时Doctrine会返回一个键中有间隙的关联数组?,symfony,doctrine-orm,Symfony,Doctrine Orm,我正在用Symfony构建一个应用程序。 我有一个条令实体,它包含(除其他属性外)另一个实体的集合(形成一个单一的关联) 在我的OuterEntityController中,在updateOuterEntityAction方法中,我执行以下操作: 解析请求 从数据库获取更新的外部数据 根据请求修改它 在实体管理器上调用flush() 在OuterEntity存储库上调用findAll() 在JsonResponse中将OuterEntity列表返回给客户端,以便通知它db的新状态。因为我使用了

我正在用Symfony构建一个应用程序。 我有一个条令实体,它包含(除其他属性外)另一个实体的集合(形成一个单一的关联)

在我的
OuterEntityController
中,在
updateOuterEntityAction
方法中,我执行以下操作:

  • 解析请求
  • 从数据库获取更新的外部数据
  • 根据请求修改它
  • 在实体管理器上调用
    flush()
  • 在OuterEntity存储库上调用
    findAll()
  • 在JsonResponse中将OuterEntity列表返回给客户端,以便通知它db的新状态。因为我使用了JsonResponse,所以我让Symfony进行序列化(很可能是使用json_encode)
除了删除关联中的一个或多个
InnerEntity
外,一切正常。问题不在于删除,而在于返回的json格式。大多数情况下,我得到的
内部
以简单数组的形式存在:

{"inners":[{inner1},{inner2},...]}
,这对我来说很好。但在从该关联中删除后(在本例中,我假设第二个关联已被删除),我得到如下数组:

{"inners":{"0":{inner1},"2":{inner2},"3":{...},...}
此外,如果最后一个
内部
被删除(或多个
内部
都位于数组末尾),则不会发生此问题

我的假设是,条令将关联放在关联数组中,当json_encode序列化此数组时,如果索引正常(0,1,2…),则以第一种格式呈现,如果索引被破坏(0,2,3…),则以第二种格式呈现

所以我现在的问题是:为什么条令在删除后不将结果放在“正常索引”数组中? 我认为Doctrine的缓存机制有问题,但我不知道具体是什么。可能是因为实体管理器仍然考虑删除的实体。但我认为实体经理在冲水后被清除了,不是吗? 我试图在实体管理器上调用
clear()
,但我有一些奇怪的行为,很快就放弃了


如果你们能指出我犯的错误,我会很高兴。

问题似乎出在我这边的键盘上

我不知道为什么,但我今天尝试了
清除
实体管理器,一切正常,正如我第一次预期的那样。我第一次尝试时一定是做了一个非常愚蠢的动作


感谢大家的帮助,并为给您带来的不便表示歉意。

这部分是因为json_encode是如何工作的,如果传递一个包含数字键的数组,它将序列化到您的第一个示例中。但是,如果传递了一个数组,其中一个键在该行中丢失,则会将其序列化为一个对象。根据您实际执行序列化的方式,可能有一些不同的方法来解决此问题。你能更新你的代码来显示你是如何序列化你的对象的吗?这确实是标准的PHP行为:。@Chausser:是的,确实,这是我推理的一部分,这就是我所谓的“正常/异常索引”(可能我的解释不清楚——对不起我的英语)。现在的问题是:为什么我得到这种缺少键的数组?您可以通过使用JmsSerialiserBundle来解决这个问题。@SamJanssens:Thx作为提示。也许我会停止使用这个包。但就目前而言,我将努力直接解决这个问题。
{"inners":{"0":{inner1},"2":{inner2},"3":{...},...}