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
相关产品推荐
相关产品推荐

