2012-09-21 51 views
4

我正在使用Symfony 2.1.2。doctrine2:未定義索引 - 與非默認referencedColumnName多對一不會持續實體

我有兩個實體並定義它們之間的[多對一(雙向)](1)關聯。我不想使用外鍵的主鍵(referencedColumnName)。我想用另一個整數唯一列:CUSTOMER_NO

/** 
* @ORM\Entity 
* @ORM\Table(name="t_myuser") 
*/ 
class MyUser extends BaseEntity // provides an id (pk) 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Customer", inversedBy="user") 
    * @ORM\JoinColumn(name="customer_no", referencedColumnName="customer_no", nullable=false) 
    */ 
    public $customer; 
} 

/** 
* @ORM\Entity 
* @ORM\Table(name="t_customer") 
*/ 
class Customer extends BaseEntity // provides an id (pk) 
{ 
    /** 
    * @ORM\Column(type="integer", unique=true, nullable=false) 
    */ 
    public $customer_no; 

    /** 
    * @ORM\OneToMany(targetEntity="MyUser", mappedBy="customer") 
    */ 
    public $user; 
} 

當我嘗試堅持一個MYUSER實體與客戶的實體,我得到這個錯誤:

注意:未定義指數:CUSTOMER_NO在... \供應商\原則\ ORM \ LIB \原則\ ORM \,持久\ BasicEntityPersister.php線608

在數據庫架構看起來不錯,這應該是重要的SQL架構定義:

CREATE UNIQUE INDEX UNIQ_B4905AC83CDDA96E ON t_customer (customer_no); 
CREATE INDEX IDX_BB041B3B3CDDA96E ON t_myuser (customer_no); 
ALTER TABLE t_myuser ADD CONSTRAINT FK_BB041B3B3CDDA96E FOREIGN KEY (customer_no) 
    REFERENCES t_customer (customer_no) NOT DEFERRABLE INITIALLY IMMEDIATE; 

所以有絕對是CUSTOMER_NO

//更新索引: 我修復inversedBy和的mappedBy的東西,但這不是問題。

(1):http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

+1

不知道這有什麼關係,但inversedBy和的mappedBy應包含:您可以測試它,太另一個實體中的屬性名稱,而不是數據庫表的名稱 –

+0

它不會說相反。看,它說mappedBy =「product」其中product是特性實體中屬性的名稱。而inversedBy =「功能」,其中功能是產品實體中屬性的名稱。它不會說任何地方的表名 –

+0

我修復它,但這不是問題 – timaschew

回答

1

@ m2mdas:
是的,你說得對,我認爲這是可能的,因爲JPA (which has influence to doctrine) has this feature。屬性referencedColumnName僅適用於您的屬性與表列不匹配的情況。

不管結果如何,我發現了一個解決方案通過修補BasicEntityPersister.php,看到這裏的要點在GitHub上:https://gist.github.com/3800132

的解決方案是增加屬性/字段名稱和值的映射列。這些信息已經存在,但沒有綁定到正確的地方。它必須被添加到$ newValId arrray這樣:

$fieldName = $targetClass->getFieldName($targetColumn); 
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName); 

它僅適用於多對一參考。 ManyToMany不起作用。
對於ManyToOne我測試它與已經存在的實體。從

@JoinColumn(name="iUserId", referencedColumnName="iUserId") 

變化tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php
學說註釋

@JoinColumn(name="username", referencedColumnName="sUsername") 
+3

我做了一個pull request:https://github.com/doctrine/doctrine2/pull/452,但是一個學說開發者說:'對不起,但我們不支持不指向主鍵的參考列。一堆漂亮的中央算法需要這個假設 – timaschew