如何在序列化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
相关产品推荐
相关产品推荐

