2012-12-12 81 views
7

另一個問題。我有一個抽象的BaseLog實體,它將關聯保存到我的用戶。 另外我有2個實體(FooLog & BarLog),它們擴展了BaseLog。另外,我有我的用戶實體,這些用戶實體假設有兩個關聯到日誌。一個用於FooLog,一個用於BarLog。這是我的問題。我收到錯誤消息,因爲我不知道如何在擴展Entity中覆蓋BaseLog的inversedBy字段。你可以幫我嗎。doctrine2映射覆蓋從MappedSuperclass繼承的InversedBy字段

因爲我覺得我的解釋不太好,在這裏設置我的實體。

BaseLog

/** @ORM\MappedSuperclass */ 
abstract class BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="logs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

FooLog

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    // Some additional fields 
} 

BarLog

/** @ORM\Entity */ 
class BarLog extends BaseLog { 
    // Some additional fields 
} 

用戶

/** @ORM\Entity */ 
class User { 
    /** 
    * @ORM\OneToMany(targetEntity="FooLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $fooLogs; 

    /** 
    * @ORM\OneToMany(targetEntity="BarLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $barLogs; 
} 

我怎麼都覆蓋BaseLoginversedByFooLog & BarLog

我就在這幾個映射錯誤設置: BaseLog

  • BaseLog:協會BaseLog#用戶是指不存在反側領域用戶#日誌。
  • FooLog:關聯FooLog#user引用不存在的反面字段User#logs。
  • BarLog:關聯BarLog#user指的是不存在的反面字段User#logs。
  • 用戶:映射用戶#fooLogs和FooLog#用戶彼此不存在關聯。
  • 用戶:映射用戶#barLogs和BarLog#用戶彼此不存在聯繫。

請幫我把我的映射排序。

+0

你有沒有解決這個問題?我正面臨類似的情況。 – hafichuk

+0

可能重複的[覆蓋inversedBy映射在教義2繼承](http://stackoverflow.com/questions/22745653/overriding-inversedby-mapping-in-doctrine-2-inheritance) – PowerKiKi

+0

@hafichuk,有一個重複的問題在那裏的一個很好的答案︰http://stackoverflow.com/a/22820964/37706 – PowerKiKi

回答

4

我有類似的問題,單繼承。我通過在兩個實體類(父類和繼承類)中定義相同的關聯來解決此問題,但名稱不同。你的情況,你可以試試這個:

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="foologs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

,並在課堂上BarLog:

/** @ORM\Entity */ 
    class BarLog extends BaseLog { 
     /** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="barlogs") 
     * @ORM\JoinColumns({ 
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
     * }) 
     */ 
     private $bar_user; 
    } 

通知不同的名稱($ bar_user)。 您還必須在用戶實體中定義foolog和barlogs屬性。這刪除了原則驗證錯誤。

1

IIRC沒有好的方法來覆蓋老版本的Doctrine中的映射。在學說> = 2.2中有一些叫做association override的東西,所以也許你可以使用它。

順便說一句爲什麼你不希望從基礎到具體類的關聯,然後定義有效的inversedBy呢?

+0

我想保持在BaseLog中的關聯,因爲它是每次相同,除了在用戶實體的var名稱。 –

+0

我看了一下提供的文檔,但我找不到如何覆蓋inversedBy字段。還有其他建議嗎? –

3

我一直在努力使用Single Table Inheritance相同的問題。據我所知,沒有解決辦法。儘管inversedBy被認爲是強制性的,但似乎你可以忽略它而忽略它。然而,正如該理論文件所表明的那樣,性能迅速惡化。

@AssociationOverride沒有幫助,因爲您無法修改關聯定義,只能修改數據庫列屬性。

我試過了一些選項,其中沒有一個是令人滿意的。

更新:運行app/console doctrine:schema:validate時,我仍然無法找到任何解決這類錯誤的方法。

[Mapping] FAIL - The entity-class 'Acme\AcmeBundle\Entity\CourseLocation' mapping is invalid: 
* The field Acme\AcmeBundle\Entity\CourseLocation#facilitators is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Acme\AcmeBundle\Entity\CourseFacilitatorResponsibility#courseLocation does not contain the required 'inversedBy' attribute. 

在這種情況下是CourseFacilitatorResponsibilityCourseResponsibility一個亞類(單表繼承)。 CourseLocation是指多個CourseResponsibility實體。我認爲單向關聯是唯一的解決方法。

+0

我也遇到這個問題。現在有沒有解決方案? – edditor