8

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

FooLogBarLogBaseLoginversedByを上書きするにはどうすればよいですか。

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

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

マッピングを並べ替えるのを手伝ってください。

4

4 に答える 4

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プロパティを定義する必要があります。これにより、教義の検証エラーが削除されます。

于 2013-09-26T10:37:21.697 に答える
3

単一テーブル継承を使用して同じ問題に苦労しました。私が知る限り、それに対する解決策はありません。必須と考えられていinversedByますが、無視することで逃げることができるようです。ただし、Doctrineのドキュメントが示唆しているように、パフォーマンスは急速に低下します。

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

この例CourseFacilitatorResponsibilityでは、のサブクラス(単一テーブル継承)ですCourseResponsibility。複数のエンティティCourseLocationを指します。CourseResponsibility一方向の関連付けがそれを回避する唯一の方法だと思います。

于 2013-03-04T07:11:22.093 に答える
1

IIRCには、古いバージョンのDoctrineのマッピングをオーバーライドする良い方法がありませんでした。Doctrine> = 2.2には、アソシエーションオーバーライドと呼ばれるものがあるので、それを使用できるかもしれません。

ところで、関連付けを基本クラスから具象クラスに移動して、有効なinversedByを定義したくないのはなぜですか?

于 2012-12-12T08:30:09.663 に答える
1

これを行う正しい方法(Doctrine 2.3以降)は、を使用することAssociationOverridesです。

マップされたスーパークラスは実際のエンティティを表していないため、クラスから削除inversedBy="logs"してからBaseLog、サブクラスでオーバーライドします。これがどのように見えるかです:

BaseLog

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

FooLog

/**
 * @ORM\Entity */
 * @ORM\AssociationOverrides({
 *     @ORM\AssociationOverride(name="user", inversedBy="fooLogs")
 * })
 */
class FooLog extends BaseLog {
  // Some additional fields
}

BarLog

/**
 * @ORM\Entity */
 * @ORM\AssociationOverrides({
 *     @ORM\AssociationOverride(name="user", inversedBy="barLogs")
 * })
 */
class BarLog extends BaseLog {
  // Some additional fields
}

name=in@ORM\AssociationOverrideは、マップされたスーパークラスからオーバーライドするフィールドを表します。

于 2020-04-27T17:48:40.520 に答える