相关信息:我使用的是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
- 这仍然无效。我也清除了缓存。
oneToMany:
experiences:
targetEntity: Experience
mappedBy: resource
fetch: EAGER
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
的一个实例,而不仅仅是我期望的数组:
为什么这是空的?我的问题是什么?我有:
答案 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]
答案 2 :(得分:0)
强制Doctrine检索所有相关实体的一个方法就是创建一个包含这些实体的dql。
$dql = "Select r, e From \MyNamespace\ToEntity\Resource r
Join r.experiences e";
$entityManager->createQuery($dql)->execute();