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



另一个问题。我有一个抽象的BaseLog实体,它保持与我的用户的关联。此外,我还有两个实体(FooLog&BarLog),它们扩展了BaseLog。此外,我还有我的用户实体,假设它持有两个与Log的关联。一个用于FooLog,一个用于BarLog。这是我的问题。我收到错误消息,因为我不知道如何在扩展Entity中覆盖BaseLog的invertedBy字段。你能帮帮我吗?

因为我认为我的解释不是很好,这里是我实体的设置。

基本日志

/** @ORMMappedSuperclass */
abstract class BaseLog {
/**
* @ORMManyToOne(targetEntity="User", inversedBy="logs")
* @ORMJoinColumns({
*   @ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $user;
}

FooLog

/** @ORMEntity */
class FooLog extends BaseLog {
// Some additional fields
}

BarLog

/** @ORMEntity */
class BarLog extends BaseLog {
// Some additional fields
}

用户

/** @ORMEntity */
class User {
/**
* @ORMOneToMany(targetEntity="FooLog", mappedBy="user", cascade={"persist"})
*/
private $fooLogs;
/**
* @ORMOneToMany(targetEntity="BarLog", mappedBy="user", cascade={"persist"})
*/
private $barLogs;
}

如何在FooLog&BarLog

我在这个设置中遇到了几个映射错误:BaseLog

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

请帮助我对映射进行排序。

我在单继承方面也遇到过类似的问题。我通过在两个实体类(父类和继承类)中定义相同的关联来解决这个问题,但名称不同。在你的情况下,你可以试试这个:

/** @ORMEntity */
class FooLog extends BaseLog {
/**
* @ORMManyToOne(targetEntity="User", inversedBy="foologs")
* @ORMJoinColumns({
*   @ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $user;
}

和类BarLog:

/** @ORMEntity */
class BarLog extends BaseLog {
/**
* @ORMManyToOne(targetEntity="User", inversedBy="barlogs")
* @ORMJoinColumns({
*   @ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $bar_user;
}

请注意不同的名称($bar_user)。您还必须在用户实体中定义傻瓜和barlog属性。这消除了条令验证错误。

我在使用单表继承时遇到过同样的问题。据我所知,目前还没有解决方案。尽管inversedBy被认为是强制性的,但你似乎可以忽略它。然而,正如Doctrine的文件所表明的那样,性能会迅速恶化。

@AssociationOverride没有帮助,因为您不能修改关联定义,只能修改数据库列属性。

我试过很多选择,没有一个是令人满意的。

更新:在运行app/console doctrine:schema:validate时,我仍然无法找到任何解决此类错误的方法。

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

在本例中,CourseFacilitatorResponsibilityCourseResponsibility的一个子类(具有单表继承)。CourseLocation是指多个CourseResponsibility实体。我认为单向关联是唯一的解决办法

正确的方法(从条令2.3开始)是使用AssociationOverrides

BaseLog类中删除inversedBy="logs"——因为映射的超类无论如何都不代表真实实体——然后在子类中覆盖它。这应该是什么样子:

基本日志

/** @ORMMappedSuperclass */
abstract class BaseLog {
/**
* @ORMManyToOne(targetEntity="User")
* @ORMJoinColumns({
*   @ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* })
*/
private $user;
}

FooLog

/**
* @ORMEntity */
* @ORMAssociationOverrides({
*     @ORMAssociationOverride(name="user", inversedBy="fooLogs")
* })
*/
class FooLog extends BaseLog {
// Some additional fields
}

BarLog

/**
* @ORMEntity */
* @ORMAssociationOverrides({
*     @ORMAssociationOverride(name="user", inversedBy="barLogs")
* })
*/
class BarLog extends BaseLog {
// Some additional fields
}

@ORMAssociationOverride中的name=表示要从映射的超类重写的字段。

IIRC在旧版本的Doctrine中没有覆盖映射的好方法。在条令>=2.2中,有一种叫做关联覆盖的东西,所以也许你可以使用它

BTW为什么你不想把关联从基类移到具体类,然后定义有效的inverted?

相关内容

  • 没有找到相关文章

最新更新