gpt4 book ai didi

php - 使用 Doctrine 实体和 JMSserializer 避免递归

转载 作者:IT王子 更新时间:2023-10-29 00:16:03 26 4
gpt4 key购买 nike

我正在使用 Symfony2、Doctrine、FOSRestBundle 和 JMSSerializer 构建 REST API。

我遇到的问题是在序列化我的实体时,序列化程序会引入任何相关实体。例如,对于作为故事的一部分的任务,故事是板的一部分,因此在序列化任务时,我得到的输出包括故事,故事包括板,然后包括板上的所有其他故事。

有没有一种简单的方法来限制它,而只包含 foreignIds 呢?

最佳答案

使用 JMS 排除策略。

在类别实体上使用注释的示例,您不想在其中包含要包含的子项和产品相关实体:

use ...
JMS\SerializerBundle\Annotation\ExclusionPolicy,
JMS\SerializerBundle\Annotation\Exclude,
...;

/**
* ...
* @ExclusionPolicy("none")
*/
class Category
{
/**
* ...
* @Exclude
*/
private $children;

/**
* ...
* @Exclude
*/
private $products;

}

看看JMSSerializer docs获取更多信息。

编辑:

例如,您可以使用部分关键字来仅选择您需要的数据。虽然我不能,但为了我的生命,如果我将实体对象传递给序列化程序(即使在 DoctrineProxyHandler 中禁用加载),则禁用完整相关实体的加载(向下两个级别),但是如果我使用一个数组,它不会通过代理使用学说延迟加载(正如预期的那样)。

使用示例实体的示例:

$dql = "SELECT t, s, partial b.{id}, partial ss.{id}
FROM Acme\AppBundle\Entity\Task t
JOIN t.story s
JOIN s.board b
JOIN b.stories ss"

$q = $this->_em-createQuery($dql);

$result = $q->getArrayResult();

这样你会得到类似的东西:

[
{
id: 33,
title: "My Task",
story: [
{
id: 554,
board: [
{
id: 14,
stories: [
{
id: 554
},
{
id: 3424
},
{
id: 3487
}
]
}
]
}
]

}
]

附:我实际上对这个“问题”很感兴趣。无论如何,我会想出如何在不使用数组结果的情况下序列化实体对象的解决方案。

关于php - 使用 Doctrine 实体和 JMSserializer 避免递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com