art*_*rxe 11 php orm foreign-keys primary-key doctrine-orm
我有两张桌子:
表阿用ID作为主键
表B,id为主键和外键
简短说明:
我需要在表B中有一个主键,它也是一个指向表A主键的外键.
谁能解释我如何通过Doctrine 2中的注释来映射这个?
注意:
我试过了这个:
class A
{
/**
* @var bigint $id
*
* @Column(name="id", type="bigint", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
private $a_id;
...
Run Code Online (Sandbox Code Playgroud)
和B表:
class B
{
/**
* @var bigint $id
* @Id
* @OneToOne(targetEntity="A", fetch="LAZY")
* @JoinColumn(name="id", referencedColumnName="id")
*/
private $b_id;
...
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误:
未捕获的异常'Doctrine\ORM\Mapping\MappingException',带有消息'没有为实体'B'指定标识符/主键.每个实体都必须有一个标识符/主键.在/var/www/agr-reg-php/Doctrine/ORM/Mapping/MappingException.php:37堆栈跟踪:
注意:我不能拥有复合主键.
Ond*_*tes 12
从Doctrine 2.1开始,这是可能的:
通过外部实体或派生实体的身份:您现在可以使用外键作为实体的标识符.这转换为在@ManyToOne或@OneToOne关联上使用@Id.您可以在本教程中阅读此功能.
最后,我通过在实体类中为真实表中的同一列指定两个字段来解决我的问题。仅在 B 类中进行更改(查看 A 类的问题):
class B
{
/**
* @var bigint $id
* @Id @Column(name="id", type="bigint", nullable="false")
*/
private $b_id;
/**
* @OneToOne(targetEntity="A", fetch="LAZY")
* @JoinColumn(name="id", referencedColumnName="id")
*/
private $a;
...
Run Code Online (Sandbox Code Playgroud)
事实上,我所做的只是在实体中为相同的主键和外键写入两个字段。