doctrine2映射覆盖从MappedSuperclass继承的inversedBy字段

dj_*_*ssi 7 mapping orm symfony doctrine-orm

另一个问题.我有一个抽象的BaseLog实体,它保持与我的用户的关联.此外,我有2个实体(FooLog和BarLog),它们扩展了BaseLog.另外我有我的用户实体,假设有两个与Log的关联.一个用于FooLog,一个用于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;
}
Run Code Online (Sandbox Code Playgroud)

FooLog

/** @ORM\Entity */
class FooLog extends BaseLog {
  // Some additional fields
}
Run Code Online (Sandbox Code Playgroud)

BarLog

/** @ORM\Entity */
class BarLog extends BaseLog {
  // Some additional fields
}
Run Code Online (Sandbox Code Playgroud)

用户

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

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

我如何有覆盖BaseLoginversedByFooLog&BarLog.

我在这个设置上得到了几个Mapping错误:BaseLog

  • BaseLog:关联BaseLog #user是指不存在的反向字段User#logs.
  • FooLog:关联FooLog #user指的是不存在的反向字段User#logs.
  • BarLog: BarLog#user关联指的是不存在的反向字段User#logs.
  • 用户:映射User#fooLogs和FooLog #user彼此不兼容.
  • 用户:映射用户#barLogs和BarLog #user彼此不兼容.

请帮我把我的映射排序.

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

在 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;
    }
Run Code Online (Sandbox Code Playgroud)

注意不同的名称($bar_user)。您还必须在用户实体中定义foologs 和barlogs 属性。这消除了学说验证错误。