如何通过Doctrine XML映射将外键设为主键?
问题:Doctrine XML映射实现派生身份(外键作为主键)
我在Doctrine官方文档中找到用Attributes实现将外键作为主键(派生身份)的方法,但想了解如何用XML实现相同效果。我尝试了两种配置方式:
第一种配置:
<id name="user_id" type="string" /> <one-to-one field="product" target-entity="App\Entity\User" orphan-removal="true"> <cascade> <cascade-persist/> <cascade-remove/> </cascade> <join-column name="user_id" referenced-column-name="id" on-delete="CASCADE" /> </one-to-one>
报错:Property App\Entity\Address::$user_id does not exist
第二种配置:
<one-to-one field="product" target-entity="App\Entity\User" orphan-removal="true"> <cascade> <cascade-persist/> <cascade-remove/> </cascade> <id name="user_id" type="string" /> <join-column name="user_id" referenced-column-name="id" on-delete="CASCADE" /> </one-to-one>
报错:No identifier/primary key specified for Entity "App\Entity\Address". Every Entity must have an identifier/primary key.
希望得到正确的XML映射配置方法。
正确的XML映射配置
要实现派生身份(将一对一关联的外键作为实体主键),需将<id>标签嵌套在<one-to-one>内部,通过关联字段派生主键,无需单独定义实体级主键字段。正确配置如下:
<entity name="App\Entity\Address" table="address"> <one-to-one field="user" target-entity="App\Entity\User" orphan-removal="true"> <cascade> <cascade-persist/> <cascade-remove/> </cascade> <id name="user_id"> <join-column name="user_id" referenced-column-name="id" on-delete="CASCADE"/> </id> </one-to-one> <!-- 可添加其他非主键字段配置 --> </entity>
关键说明:
- 实体级别无需单独定义
<id>,<id>嵌套在<one-to-one>内表示主键由关联实体派生 - 实体类中只需定义一对一关联属性(如
$user),不需要单独的$user_id属性 <join-column>必须嵌套在<id>内部,明确数据库列的映射关系
对应实体类代码示例:
namespace App\Entity; class Address { private $user; // Getter & Setter public function getUser(): ?User { return $this->user; } public function setUser(User $user): self { $this->user = $user; return $this; } // 其他字段的Getter/Setter }
内容的提问来源于stack exchange,提问作者Bogdan Dubyk
相关产品推荐
相关产品推荐

