我在使用Doctrine2时遇到了一个奇怪的问题。
我得到以下错误:
条令orm:验证模式
[Mapping] FAIL - The entity-class 'EmailVerification' mapping is invalid:
* The referenced column name 'id' does not have a corresponding field with this
column name on the class 'OurUsers'.
[Database] OK - The database schema is in sync with the mapping files.
我的场景如下:
- 我有3个表共享一个主键
- 保存
user_id
PK的表Auth
- 表
OurUsers
,其中Auth.user_id
被共享PK - 表
EmailVerification
,其中OurUsers.user_id
被共享PK - 我也有
NotOurUsers
,所以就分开了
实体声明如下:
/**
* @Entity
* @Table(name="auth")
*/
class Auth {
/** @Id @Column(type="integer", name="user_id") @GeneratedValue @var int */
private $id;
/* ... */
}
/**
* @Entity
* @Table(name="our_users")
*/
class OurUsers {
/**
* @Id
* @OneToOne(targetEntity="Auth")
* @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
* @var Auth
*/
private $id;
/* ... */
}
/**
* @Entity
* @Table(name="email_verification")
*/
class EmailVerification {
/**
* @Id
* @OneToOne(targetEntity="OurUsers")
* @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
* @var OurUsers
*/
private $id;
/* ... */
}
我用的是Doctrine 2.1。
btwDoctrine 2.2验证映射是好的,但我在运行时遇到了与2.1相同的错误。
我认为问题是EmailVerfication指向OurUSers intead to Auth,但错误消息具有误导性。我不确定从内部来看三重映射是可能的(我很确定我为此实现了一个异常——在某些地方,我必须看看为什么没有触发它)。
在JoinColumn语句中告诉您使用user_id
列。
但是OurUser::id
的列定义默认情况下会创建一个id
列。
您必须修改JoinColumn语句才能使用id
:
/**
* @Entity
* @Table(name="email_verification")
*/
class EmailVerification {
/**
* @Id
* @OneToOne(targetEntity="OurUsers")
* @JoinColumn(nullable=false, name="user_id", referencedColumnName="id")
* @var OurUsers
*/
private $id;
/* ... */
}
或
在OurUser::id
上添加Column
注释,如下所示:
/**
* @Entity
* @Table(name="our_users")
*/
class OurUsers {
/**
* @Id
* @OneToOne(targetEntity="Auth")
* @Column(type="integer", name="user_id")
* @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
* @var Auth
*/
private $id;
/* ... */
}
我认为切换到这样的东西会更好,它更清晰,应该会产生更少的问题:
/**
* @Entity
* @Table(name="auth")
*/
class Auth {
/** @Id @Column(type="integer", name="user_id") @GeneratedValue @var int */
private $id;
/* ... */
}
/**
* @Entity
* @Table(name="our_users")
*/
class OurUsers {
/**
* @Id
* @GeneratedValue
*/
private $id;
/**
* @OneToOne(targetEntity="Auth")
* @var Auth
*/
private $auth;
/* ... */
}
/**
* @Entity
* @Table(name="email_verification")
*/
class EmailVerification {
/**
* @Id
* @GeneratedValue
*/
private $id;
/**
* @OneToOne(targetEntity="OurUsers")
* @var OurUsers
*/
private $ourUser;
/* ... */
}