2012-07-05 80 views
1

我相信有一個簡單的解決方案,但我無法理解發生了什麼事情。我有一個名爲Payment的實體和另外兩個名爲UserHousehold的實體。ManyToOne映射與教義和未定義的索引警告

A User有很多Payment s和和Household有很多Payment s。這是使用YAML所有映射爲Payment的單向多對一的關係,這樣的(希望這是在http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html#many-to-one-unidirectional與指導線) -

Payment: 
    type: entity 
    table: payments 
    id: 
    _id: 
     type: integer 
     column: payment_id 
     generator: 
     strategy: AUTO 
    manyToOne: 
    _user: 
     targetEntity: Application_Model_User 
     joinColumn: 
     name: user_id 
     referencedColumnName: payment_id 
    _household: 
     targetEntity: Application_Model_Household 
     joinColumn: 
     name: household_id 
     referencedColumnName: payment_id 

數據庫明智的,我有三個表,userspaymentshouseholdspayments表(除了它的主鍵外)有兩列,分別稱爲user_idhousehold_id,它們與其他兩個表的主鍵相對應。

的問題是,當我嘗試堅持新Payment我得到一個錯誤回來從MySQL告訴我的paymentsuser_id列不能爲空。一些挖掘已經確定該原則在INSERT語句中爲user_idhousehold_id提供null。對象圖絕對正確。

此外,我得到以下警告:

Notice: Undefined index: payment_id in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511 

Notice: Undefined index: in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511 

Notice: Undefined index: payment_id in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511 

Notice: Undefined index: in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511 

我已經確定有問題的payment_idreferencedColumnName在我的映射來了,該指數是不確定的,因爲數組學說搜索包含來自對面的一側的關係,即HouseholdUser。但肯定不應該是?我認爲我遵循了指南,但我無法完成工作。

我使用Zend框架,如果有幫助,但沒有什麼特別的我的代碼。我很確定這是一個映射問題。

感謝

回答

7

我只用主義+ Symfony2的工作,但我覺得你referencedColumnName應該只是「身份證」,沒有payment_id,因爲你需要解釋的外鍵關係。

payment.household_id --reference - >household.id

在Symfony2中,Doctrine有一個'inversedBy'屬性,用於映射另一個表中代表payment_id的列。

的代碼從一個Symfony2的映射一個片段:

/** 
* @ORM\ManyToOne(targetEntity="kurtfunai\WalkthroughBundle\Entity\Group", inversedBy="members") 
* @ORM\JoinColumn(name="fk_group_id", referencedColumnName="id") 
*/ 
protected $group; 

你的情況,那就需要改變的東西是這樣的:

_user: 
    targetEntity: Application_Model_User 
    joinColumn: 
    name: user_id 
    referencedColumnName: <USERS_TABLE_PRIMARY_KEY_COLUMN_NAME> 
_household: 
    targetEntity: Application_Model_Household 
    joinColumn: 
    name: household_id 
    referencedColumnName: <HOUSEHOLDS_TABLE_PRIMARY_KEY_COLUMN_NAME> 

(具有相應的列名替換)

+0

支付表*中的主鍵列被稱爲'payment_id' - 所以這就是referencedColumnName應該是什麼,對嗎? – Jez 2012-07-05 15:21:09

+1

不,在這種情況下,您正在映射付款和家庭表之間的外鍵關係。如果您的付款表上的主鍵是'payments.payment_id',那沒什麼問題(儘管我認爲Doctrine強制將id作爲主鍵名) - 但付款主鍵並不是必需的。 你實際上映射的是FK關係,所以在這種情況下'payments.household_id'引用了您的家庭表的id列(我將假定它的名字相似:'households.household_id'。 – 2012-07-05 15:53:53

+0

我已經編輯我的答案,以說明我說得更清楚 – 2012-07-05 16:01:19