2012-12-12 14 views
7

別の質問。私は抽象的なBaseLog Entityを持っていて、私のユーザとの関連を維持しています。 さらに、BaseLogを拡張する2つのエンティティ(FooLog & BarLog)があります。さらに私は、ログに2つの関連付けを保持すると思われるユーザエンティティを持っています。 1つはFooLog用、もう1つはBarLog用です。ここに私の問題があります。エンティティを拡張する際に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; 
} 

にはどうすればFooLog & BarLogBaseLogさんinversedByを上書きする必要があります。

私はこの上でいくつかのマッピングエラーが発生しますが、設定: BaseLog

  • BaseLog:を連想BaseLogの#ユーザーが存在しない逆側フィールドユーザ#ログを参照します。
  • FooLog:関連FooLog#userは、存在しない逆サイドフィールドUser#logsを参照します。
  • BarLog:関連BarLog#userは、存在しない逆サイドフィールドUser#logsを参照します。
  • ユーザー:マッピングのUser#fooLogsとFooLog#userは、互いに矛盾しています。
  • ユーザー:マッピングのUser#barLogsとBarLog#userは、互いに矛盾しています。

私のマッピングをソートするのを手伝ってください。

+0

これを解決しましたか?私は同様の状況に直面している。 – hafichuk

+0

[Doctrine 2の継承でのoverversingByマッピングのオーバーライド]の可能な複製(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)あなたのケースでは、あなたはこれを試すことができます。 また、ユーザーエンティティでfoologsおよびbarlogsプロパティーを定義する必要があります。これは、教義検証エラーを取り除きます。

1

IIRC古いバージョンのDoctrineでマッピングを上書きする良い方法がありませんでした。 Doctrine> = 2.2では、association overrideと呼ばれるものがありますので、おそらくそれを使用することができます。

BTWなぜ、移動関連をベースクラスから具象クラスに移動し、有効な逆クラスを定義したくないのですか?

+0

Userエンティティのvar名を除いて同じであるため、私はBaseLogに関連付けを保持したいと思います。 –

+0

私は提供されたドキュメントを見ましたが、inversedByフィールドを上書きする方法が見つかりません。その他の提案はありますか? –

3

私はSingle Table Inheritanceを使って同じ問題で苦労しました。私が知る限り、それに対する解決策はありません。inversedByは強制と見なされますが、無視することで逃れることができます。しかし、Doctrineの文書が示唆するように、パフォーマンスは急速に悪化します。

@AssociationOverrideアソシエーション定義を変更できないため、データベース列のプロパティのみを変更することはできません。

私は多くのオプションを試しましたが、どれも満足できませんでした。

更新:app/console doctrine:schema:validateを実行しても、この種のエラーの解決策はまだ見つかりませんでした。この場合CourseFacilitatorResponsibility

[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. 

CourseResponsibilityの(単一テーブル継承を有する)のサブクラスです。 CourseLocationは、複数のエンティティCourseResponsibilityを指します。私は単方向協会がその周りの唯一の方法だと思います。

+0

私もこの問題にぶつかります。今のところ解決策はありますか? – edditor

関連する問題