避免 Doctrine 返回完整的相关实体

Posted

技术标签:

【中文标题】避免 Doctrine 返回完整的相关实体【英文标题】:Avoid Doctrine to return full related entity 【发布时间】:2021-05-17 07:11:49 【问题描述】:

我是 Symfony 的新手,我正在尝试从我的内容表中获取所有记录。它有效,但它也返回相关实体的所有字段。

$content = $this->contentRepository->findAll();

这是我得到的:

[
    "id": 2,
    "field1": "xx",
    "field2": "xx",
    "field3": 22,
    "field4": "id":1, "field1":"xx", ...,
    ....
,...]

在 field4 上,我只想获取 id 作为值,而不是整个对象。就像我在做 SQL 一样。 从其他地方阅读我发现有关lazy_loading 的信息,但它似乎不起作用。

【问题讨论】:

您可以使用数据传输对象仅获取某些字段doctrine-project.org/projects/doctrine-orm/en/2.7/reference/… 【参考方案1】:
public function getContentData(): array

    $qb = $this->createQueryBuilder('c');

    $qb->select('c.id as id, IDENTITY(c.field4) as field4, c.field1 as field1, c.field2 as field2, c.field3 as field3');

    return  $qb->getQuery()->getArrayResult();

但是如果要获取字段数组,最好是获取实体数组并通过JMSSerializerBundle或The Serializer Component进行序列化

【讨论】:

【参考方案2】:

只需转到您的 contentRepository 文件并定义这样的函数

public function getAllContentIds()

    $qb = $this->createQueryBuilder();
    return $qb->select('id')
        ->from('YourBundleName:YourTableName')
        ->getQuery()
        ->getResult();

然后像这样使用这个函数

$contentIds = $this->contentRepository->getAllContentIds();

【讨论】:

我的意思是,学说返回整个关联实体作为field4的值,我只需要那个实体的id。 其他字段没问题 考虑更新您的答案以匹配问题。这可能会很有挑战性,因为 Doctrine 不支持加入部分实体。

以上是关于避免 Doctrine 返回完整的相关实体的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 ORM 级联删除相关实体

添加相关实体时,Doctrine 对象未设置外键

Doctrine 2 OneToOne 实体映射返回空实体

Symfony - Doctrine 实体的返回类型

Symfony - Doctrine实体的返回类型

Symfony2/Doctrine - 与普通 SQL 相关的实体抽象