Php 带有Doctrine2的三重分割映射问题
我在使用Doctrine2时遇到了一个奇怪的问题 我得到以下错误: orm:验证模式Php 带有Doctrine2的三重分割映射问题,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,我在使用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
[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.
我的设想如下:
/**
* @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;
/* ... */
}
- 我有3个表共享一个主键
- 表
包含Auth
PKuser\u id
- 表
,其中OurUsers
为共享主键Auth.user\u id
- 表
,其中EmailVerification
是共享PKOurUsers.user\u id
- 我也有
——因此分裂了notoursers
/**
* @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
顺便说一句原则2.2验证了映射的正确性,但我在运行时遇到了与2.1相同的错误。您在JoinColumn语句中告诉我,您使用的是
用户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
上添加列
注释,如下所示:
/**
* @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;
/* ... */
}
我认为问题在于EmailVerfication指向我们的用户进行身份验证,但错误消息具有误导性。我不确定三重映射是否可以从内部实现(我很确定我在某些地方也实现了一个例外,我必须看看为什么没有触发它)。我认为最好切换到类似这样的方式,它更清晰,应该会产生更少的问题:
/**
* @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;
/* ... */
}
如果您将EmailVerification中的
referencedColumnName
更改为仅“id”
,该怎么办?这样,它将引用OurUsers类中的id属性,这在术语上是指Auth中的user\u id。我想问题一定是在附近的某个地方,在这里发布之前尝试过它-不起作用。谢谢你的回复。我遵循了你的第二个解决方案。这就是我得到的错误:类的对象OurUsers无法转换为string~…\doctor\ORM\UnitOfWork.php
。但至少现在它证明了这一点。我会尝试将\uuu添加到字符串
,但如果它有效-这是一个黑客。切换到v2.2,它会尝试将我们的用户
转换为UnitOfWork::tryGetById
中的字符串。它接收的类看起来是要接收的正确类。你能在doctor-project.org/jira上添加一个票证,并在发生这种情况的地方添加堆栈跟踪吗?我考虑过这样做。但是,有一个但是。如果我不能控制模式怎么办?甚至,我是否应该改变我的DB设计,因为条令2不能支持三重分割,无论出于什么原因?