[英]doctrine2 mapping overwrite inherited inversedBy field from MappedSuperclass
另一个问题。 我有一个抽象的 BaseLog 实体,它保持与我的用户的关联。 此外,我有 2 个扩展 BaseLog 的实体(FooLog 和 BarLog)。 此外,我有我的用户实体,它应该拥有两个与 Log 的关联。 一种用于 FooLog,一种用于 BarLog。 这是我的问题。 我收到错误消息,因为我不知道如何在扩展实体时覆盖 BaseLog 的 inversedBy 字段。 请你帮助我好吗。
因为我觉得我的解释不是很好,这里是我的实体的设置。
基本日志
/** @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
}
条形日志
/** @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;
}
我如何有覆盖BaseLog的inversedBy在FooLog&BarLog。
我在这个设置上遇到几个映射错误:BaseLog
请帮我整理我的映射。
我对单一继承有类似的问题。 我通过在两个实体类(父类和继承类)中定义相同的关联但名称不同来解决这个问题。 在你的情况下,你可以试试这个:
/** @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 属性。 这消除了学说验证错误。
我在使用Single Table Inheritance 时遇到了同样的问题。 据我所知,没有解决方案。 尽管inversedBy
被认为是强制性的,但您似乎可以忽略它。 然而,正如 Doctrine 文档所暗示的那样,性能会迅速恶化。
@AssociationOverride
没有帮助,因为您不能修改关联定义,只能修改数据库列属性。
我尝试了多种选择,但都不是令人满意的。
更新:在运行app/console doctrine:schema:validate
时,我仍然无法找到任何解决这些类型错误的方法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
实体。 我认为单向关联是解决它的唯一方法。
IIRC 没有很好的方法来覆盖旧版本的 Doctrine 中的映射。 在 Doctrine >= 2.2 中有一种叫做关联覆盖的东西,所以也许你可以使用它。
顺便说一句,为什么您不希望将关联从基础类移动到具体类并定义有效的 inversedBy 呢?
执行此操作的正确方法(自 Doctrine 2.3 起)是使用AssociationOverrides
。
从BaseLog
类中删除BaseLog
inversedBy="logs"
- 因为映射的超类无论如何都不代表真正的实体 - 然后在子类中覆盖它。 这应该是这样的:
基本日志
/** @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
}
条形日志
/**
* @ORM\Entity */
* @ORM\AssociationOverrides({
* @ORM\AssociationOverride(name="user", inversedBy="barLogs")
* })
*/
class BarLog extends BaseLog {
// Some additional fields
}
@ORM\\AssociationOverride
name=
表示要从映射的超类中覆盖的字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.