You need to enable JavaScript to run this app. 如何在序列化Doctrine实体时仅输出关联子对象的ID而非完整对象
优惠活动
大模型
产品
解决方案
定价
更多

如何在序列化Doctrine实体时仅输出关联子对象的ID而非完整对象

实现方案

你现在的序列化结果是因为注解@Groups({"get"})加在了关联属性$company上,序列化器会自动把关联的Company对象也按序列化组规则序列化,所以输出了嵌套对象。要输出关联ID,有2种常用的实现方式:

  • 方案1:修改实体序列化配置(最简便,针对单字段处理)
    把User类中$company属性的@Groups({"get"})注解移除,新增一个获取关联公司ID的方法,指定序列化名称和分组即可:
// 先导入对应序列化组件的SerializedName注解
// Symfony原生Serializer导入:use Symfony\Component\Serializer\Annotation\SerializedName;
// JMS Serializer导入:use JMS\Serializer\Annotation\SerializedName;

class User {
    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @Groups ({"get"})
     */
    private $email;

    /**
     * @ORM\ManyToOne(targetEntity=Company::class, inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     * 移除此处的@Groups注解
     */
    private $company;

    /**
     * @Groups({"get"})
     * @SerializedName("company") // 保证输出的字段名仍为company
     */
    public function getCompanyId(): ?int
    {
        return $this->company?->getId();
    }
}
  • 方案2:全局配置序列化规则(适合批量处理所有关联字段)
    如果你用的是Symfony Serializer组件,可以自定义一个规范化器,全局处理所有ToOne关联的序列化规则,遇到ToOne关联时直接返回关联对象的主键值,不用序列化整个对象。该方案适合有大量同类需求的场景,不需要逐个修改实体的注解配置。

注意你贴出的代码里company类名首字母没有大写,和User类中targetEntity的Company::class大小写不一致,实际运行可能会报错,建议调整一致。

内容的提问来源于stack exchange,提问作者Mark van Haaren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 08:42:03