You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Doctrine:如何描述复合主键的ManyToOne关联并设置级联更新

解决方案

1. 多对一关联关系配置

要实现多个Child关联到一个Parent的多对一关系,你需要在Child实体中定义关联到Parent的属性,并通过Doctrine注解映射到Parent的复合主键。具体代码配置如下:

class Child
{
    // ... 其他属性与方法

    /**
     * @ORM\ManyToOne(targetEntity=Parent::class)
     * @ORM\JoinColumns({
     *     @ORM\JoinColumn(name="parent_id", referencedColumnName="id"),
     *     @ORM\JoinColumn(name="parent_est_date", referencedColumnName="est_date")
     * })
     */
    private ?Parent $parent = null;

    // 若需单独操作外键字段,可保留以下属性并添加Column注解(类型需与Parent对应字段匹配)
    /**
     * @ORM\Column(type="integer") // 替换为Parent中id的实际类型,如string/integer等
     */
    private $parentId;

    /**
     * @ORM\Column(type="integer")
     */
    private int $parentEstDate;

    // ... 对应的getter、setter方法
}

@ManyToOne指定关联的目标实体为Parent,@JoinColumns中的两个@JoinColumn分别将Child的parent_id、parent_est_date外键字段,与Parent的id、est_date主键字段关联起来。如果不需要单独操作外键字段,也可以仅保留$parent属性,Doctrine会自动管理对应的外键列。

2. 级联更新配置

要实现Parent的estDate变更时,Child的parentEstDate自动同步更新,只需在映射est_date的@JoinColumn中添加onUpdate="CASCADE"参数,让数据库层面自动处理级联更新:

class Child
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity=Parent::class)
     * @ORM\JoinColumns({
     *     @ORM\JoinColumn(name="parent_id", referencedColumnName="id"),
     *     @ORM\JoinColumn(name="parent_est_date", referencedColumnName="est_date", onUpdate="CASCADE")
     * })
     */
    private ?Parent $parent = null;

    // ...
}

添加onUpdate="CASCADE"后,当Parent表中的est_date字段被更新时,数据库会自动将Child表中对应的parent_est_date字段同步更新。主流数据库(如MySQL、PostgreSQL)均支持该级联操作。

内容的提问来源于stack exchange,提问作者Hevyweb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:54