2012-02-09 102 views
0

我遇到了一个奇怪的问题,使用Doctrine2。与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个表共享一个主键。
  • Auth其中保存user_id PK。
  • 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; 

    /* ... */ 
} 

我使用Dosctrine 2.1。

btw学说2.2验证映射是好的,但在运行时我得到与2.1相同的错误。

+0

什么,如果你改变了'referencedColumnName'在EmailVerification只是'“身份证” '?这样它就会引用OurUsers类中的id属性,这个属性指的是Auth中的user_id。我认为这个问题肯定是在 – jere 2012-02-09 14:49:47

+0

之前试过的,在这里发布 - 不工作。 – David 2012-02-12 13:03:31

回答

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

加上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; 

    /* ... */ 
} 
+0

感谢您的回复。我已遵循你的第二个解决方案。这就是我得到的错误:'OurUsers类的对象无法转换为字符串〜... \ Doctrine \ ORM \ UnitOfWork.php'。但至少现在它证实了。我会尝试添加'__toString',但如果它有效 - 这是一个黑客攻击。 – David 2012-02-12 10:53:46

1

我认为这个问题是该EmailVerfication指向OurUSers intead到Auth,但错误信息是误导。我不确定三重映射是否可能从内部(我很确定我实现了这种情况的一个例外,我必须看看为什么没有触发)。

+0

切换到v2.2,它试图将'OurUsers'转换为'UnitOfWork :: tryGetById'中的字符串。它收到的类看起来是正确的接收。 – David 2012-02-12 13:02:33

+1

您可以在doctrine-project.org/jira上添加一张票并在发生这种情况时添加堆栈跟踪? – beberlei 2012-02-12 22:17:01

+0

http://www.doctrine-project.org/jira/browse/DDC-1649 – David 2012-02-13 08:51:01

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; 

    /* ... */ 
} 
+0

我想过要做那样的事情。但是,有一个但是。如果我无法控制架构会怎么样?甚至,我是否应该改变我的数据库设计,因为无论出于何种原因,Doctrine 2不能支持三重分割? – David 2012-02-13 07:08:04