Doctrine基于entityUid字段实现无中间表OneToMany关联问题
解决方案
你可以通过Doctrine的JoinColumn注解自定义关联字段,无需创建中间表即可实现基于uid的单向OneToMany关联,具体实现如下:
1. 关联注解配置
分别修改Document、Building实体中的$medias属性注解即可:
// Document类中的$medias配置(Building类配置完全相同) use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; class Document { // 原有其他属性保持不变 /** * @var Media[]|Collection * @ORM\OneToMany(targetEntity="Media", fetch="EXTRA_LAZY") * @ORM\JoinColumn(name="entityUid", referencedColumnName="uid") */ private $medias; public function __construct() { // 必须初始化集合属性,否则关联操作会报错 $this->medias = new ArrayCollection(); } // 原有其他方法保持不变 }
2. 配置说明
@JoinColumn的name参数指定关联的目标表字段,即Media表的entityUid字段referencedColumnName参数指定当前实体用于关联的字段,即Document/Building的uid字段,不需要强制使用默认主键id- 不需要在Media实体中添加任何反向关联注解,完全符合你不需要反向映射的要求
3. 关联操作注意事项
因为是单向关联,Doctrine不会自动维护Media的entityUid字段写入,新增关联媒体时需要手动赋值即可:
// 示例:给Document对象新增关联媒体 $media = new Media(); $media->setEntityUid($document->getUid()); $media->setLink('xxx.jpg'); $entityManager->persist($media); // 获取关联媒体的方式保持不变 $mediaList = $document->getMedias();
内容的提问来源于stack exchange,提问作者Andrex_80
相关产品推荐
相关产品推荐

