序列化

时间:2016-11-30 10:56:59

标签: php symfony doctrine-orm

  

相关信息:我使用的是Symfony 2.8.x,Doctrine 2.4.8和JMSSerializerBundle 1.0。

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

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

我使用以下方法检索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的一个实例,而不仅仅是我期望的数组:

enter image description here

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

  • 弄乱了关系配置,这实际上与延迟加载无关
  • 在错误的地方放置延迟装载
  • 误解了,因为递归,这是的事情?
  • 其他什么东西迟钝了?

3 个答案:

答案 0 :(得分:1)

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

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

如果您仍希望体验完全包含其资源,则可能必须配置序列化程序并强制它在序列化方面更进一步。但大多数情况下,Serializers以这种方式配置以避免无限循环(包含其经验的资源,包含其资源,包含其经验等等。

答案 1 :(得分:0)

也许您需要将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",

[UPDATE]

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

答案 2 :(得分:0)

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

$dql = "Select r, e From \MyNamespace\ToEntity\Resource r 
         Join r.experiences e";

$entityManager->createQuery($dql)->execute();