Php 在序列化时,一对一关系导致反向实体上的外键为空
相关信息:我正在使用Symfony 2.8.x、Doctrine 2.4.8和JMSSerializerBundle 1.0 一个Php 在序列化时,一对一关系导致反向实体上的外键为空,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,相关信息:我正在使用Symfony 2.8.x、Doctrine 2.4.8和JMSSerializerBundle 1.0 一个资源可以有许多经验。我正在进行API调用以检索资源和所有相关的体验 但是,我返回的JSON在Experience实体的$resource上包含一个null 我正在使用以下方法检索资源: $this->findBy([], [], $limit, $offset); 我认为这不应该是一个问题,因为我已经尝试在注释中直接将fetch模式设置为EAGER——这仍然不
资源
可以有许多经验
。我正在进行API调用以检索资源
和所有相关的体验
但是,我返回的JSON在Experience
实体的$resource
上包含一个null
我正在使用以下方法检索资源
:
$this->findBy([], [], $limit, $offset);
我认为这不应该是一个问题,因为我已经尝试在注释中直接将fetch模式设置为EAGER
——这仍然不起作用。我还清除了缓存
Resource.orm.yml
Experience.orm.yml
看,我已经试过了所有急切的抓取
回应
我为这个json发出API请求时得到的响应:
{
"resources": [{
"id": 1,
# SNIP #
"experiences": [{
"resource": null,
"id": 1,
# SNIP #
}]
}]
}
请注意资源的空值
以下是我认为延迟加载有问题的原因:集合是doctor\ORM\PersistentCollection
的实例,而不是我所期望的数组:
为什么为空???我的问题是什么?我是否:
- 搞砸了关系配置,这实际上与延迟加载无关
- 将延迟加载放置在错误的位置
- 误解了,这是一件好事,因为递归
- 还有什么别的弱智吗
也许您需要将原则2.4.8升级到2.5
[更新]
强制检索所有相关实体的方法之一是创建包含这些实体的dql
$dql = "Select r, e From \MyNamespace\ToEntity\Resource r
Join r.experiences e";
$entityManager->createQuery($dql)->execute();
这可能是API及其序列化程序(模型到JSON转换)的正常行为
为什么您需要实际填写经验。资源?您已经在JSON的根级别拥有了它
如果您仍然希望体验完全包含他们的资源,那么您可能必须配置序列化程序,并强制它在序列化过程中更深一步。但大多数情况下,序列化程序都是以这种方式配置的,以避免无限循环(资源包含其经验、资源包含其经验,等等)..尝试更新到2.5.5
并清除缓存,无更改:-(你有没有试过在查询中直接使用EAGER,比如链接?是的,我想这可能是为了避免递归(我的要点之一)…如果您的API也基于Symfony,它可能会使用本机序列化程序或JMS序列化程序。在这两种情况下,我非常确定您可以为序列化配置递归级别。但只有在确实需要时才这样做。大多数情况下,默认递归级别符合常见需要。
{
"resources": [{
"id": 1,
# SNIP #
"experiences": [{
"resource": null,
"id": 1,
# SNIP #
}]
}]
}
> "doctrine/doctrine-module":"dev-master",
> "doctrine/doctrine-orm-module": "dev-master",
> "doctrine/dbal":"2.5.*@dev",
> "doctrine/orm": "2.5.*@dev",
$dql = "Select r, e From \MyNamespace\ToEntity\Resource r
Join r.experiences e";
$entityManager->createQuery($dql)->execute();