2012-02-09 52 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