【问题标题】:Doctrine oneToMany relationship results in null for foreign key on inverse entity when serializing序列化时,学说 oneToMany 关系导致反向实体上的外键为空
【发布时间】:2016-11-30 10:56:58
【问题描述】:

相关信息:我正在使用 Symfony 2.8.x、Doctrine 2.4.8 和 JMSSerializerBundle 1.0。

一个Resource 可以有多个Experiences。我正在进行 API 调用 以检索 Resource 和所有关联的 Experiences。

但是,我返回的 JSON 在Experience 实体上的$resource 上包含null

我正在使用以下方法来检索Resource

$this->findBy([], [], $limit, $offset);

我不认为这应该是一个问题,因为我已经尝试直接在注释中将获取模式设置为EAGER - 这仍然没有奏效。我也清除了缓存。

Resource.orm.yml

oneToMany:
    experiences:
        targetEntity: Experience
        mappedBy: resource
        fetch: EAGER

Experience.orm.yml

resource:
    targetEntity: Resource
    inversedBy: experiences
    joinColumn:
        name: resource_id
        referencedColumnName: id
        fetch: EAGER
    fetch: EAGER

看到我已经尝试了所有急切的获取!

响应

对此 json 发出 API 请求时得到的响应:

{
    "resources": [{
        "id": 1,
        # SNIP #
        "experiences": [{
            "resource": null,
            "id": 1,
            # SNIP #
        }]
    }]
}

注意资源的空值!

这就是我认为延迟加载存在问题的原因:该集合是Doctrine\ORM\PersistentCollection 的一个实例,而不仅仅是我所期望的一个数组:

为什么这个为空??我的问题是什么?我有没有:

  • 搞砸了关系配置,这实际上与延迟加载无关
  • 将延迟加载放置在错误的位置
  • 误解了,因为递归,这是一件好事
  • 还有什么迟钝的?

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    这可能是 API 及其序列化程序(模型到 JSON 转换)的正常行为。

    为什么实际上需要填写experiences.resource?您已经在 J​​SON 的根级别上拥有它。

    如果您仍希望体验完全包含其资源,您可能必须配置序列化程序并强制它在序列化中更深入一步。但大多数时候,序列化器是这样配置的,以避免无限循环(资源包含它的经验,包含它的资源,包含它的经验,等等......

    【讨论】:

    • 是的,我认为这可能与避免递归有关(作为我的要点之一)..
    • 如果你的 API 也是基于 Symfony,它可能使用原生的 Serializer 或 JMS Serializer。在这两种情况下,我很确定您可以配置序列化的递归级别。但只有当你真的需要时才这样做。大多数情况下,默认递归级别适合常见需求。
    【解决方案2】:

    强制 Doctrine 检索所有相关实体的一个方法是创建一个包含这些实体的 dql。

    $dql = "Select r, e From \MyNamespace\ToEntity\Resource r 
             Join r.experiences e";
    
    $entityManager->createQuery($dql)->execute();
    

    【讨论】:

      【解决方案3】:

      也许你需要将 Doctrine 2.4.8 升级到 2.5

      Doctrine2 in ZF2 - DQL gives different result than findOneBy method

      > "doctrine/doctrine-module":"dev-master",
      > "doctrine/doctrine-orm-module": "dev-master",
      > "doctrine/dbal":"2.5.*@dev",
      > "doctrine/orm": "2.5.*@dev",
      

      [更新]

      Getting a "true" object from a proxy object in doctrine2

      【讨论】:

      • 尝试更新到2.5.5并清除缓存,没有变化:-(
      • 您是否尝试过像链接一样在查询中直接使用 EAGER?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多