我在使用Doctrine2时遇到了一个奇怪的问题。
我收到以下错误:
doctrine orm:validate-schema
[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.
我的方案如下:
Auth
,其中包含user_id
PK。OurUsers
共享PK的表Auth.user_id
。EmailVerification
共享PK的表OurUsers.user_id
。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;
/* ... */
}
我正在使用Dosctrine 2.1。
btw Doctrine 2.2验证映射是否正常,但在运行时我得到的错误与2.1相同。
答案 0 :(得分:1)
我认为问题在于EmailVerfication指向OurUSers对Auth的意图,但错误信息却令人误解。我不确定三元映射是否可以从内部进行(我很确定我已经为这个实现了一个例外,我必须看看为什么没有触发)。
答案 1 :(得分:0)
您在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;
/* ... */
}
OR
在Column
上添加OurUser::id
注释,如下所示:
/**
* @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;
/* ... */
}
答案 2 :(得分:0)
我认为切换到这样的事情会更好,它会更清晰,并且应该创造更少的问题:
/**
* @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;
/* ... */
}