Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在序列化时,一对一关系导致反向实体上的外键为空_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 在序列化时,一对一关系导致反向实体上的外键为空

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——这仍然不

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

一个
资源
可以有许多
经验
。我正在进行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();