【问题标题】:Extending an entity class in doctrine在教义中扩展实体类
【发布时间】:2016-04-08 16:16:32
【问题描述】:

我正在尝试扩展一个用作学说实体的类,但由于某种原因,我不断收到错误消息:

表 'admin_subdivisions' 上没有名为 'location_id' 的列

当我说扩展时,我的意思是 php 级别而不是数据库级别。我只是想创建另一个带有额外列的表。我有几个实体扩展了以下抽象类

abstract class LocationProxy
{
    /**
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="Location", cascade={"ALL"}, fetch="LAZY")
     * @ORM\JoinColumn(name="location_id", referencedColumnName="location_id", nullable=false)
     * 
     * @var Location
     */
    protected $location;
}

这些二级课程都没有给我带来任何问题。现在,我想扩展这个二级类

/**
 * @ORM\Entity()
 * @ORM\Table(name="admin_divisions")
 */
class AdminDivision extends LocationProxy
{
}

有了这个

/**
 * @ORM\Entity()
 * @ORM\Table(name="admin_subdivisions")
 */
class AdminSubDivision extends AdminDivision
{
}

但是,它会产生错误。谁能指出我做错了什么?

这是 Location 类的定义

/**
 * @ORM\Entity()
 * @ORM\Table(name="locations")
 */
class Location
{
    /**
     * @ORM\Id
     * @ORM\Column(name="location_id", type="integer", options={"unsigned"=true})
     * 
     * @var int
     */
    private $id;
}

【问题讨论】:

  • 你的joinColumnreferencedColumnName是不是Location实体的主键?
  • @chalasr,是的,并将其添加到操作中。我通过创建一个额外的abstract Admin 类,然后从该类扩展AdminDivisionAdminSubDivision 来实现它。但是我还是想知道为什么上面的代码行不通。
  • 对不起,我不明白为什么,希望别人能给它,如果没有人,我会在我这边尝试。另一种解决方法是使用一个特征并在您的两个类中使用它,顺便说一句,使这些类能够扩展另一个类,同时保留 $location 属性。

标签: php doctrine-orm


【解决方案1】:

您必须指定继承类型,以便教义知道如何为子类构建表:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#mapped-superclasses

在您的情况下,您需要将以下注释添加到您的抽象 LocationProxy 类中:

 @ORM\Entity
 @ORM\InheritanceType("JOINED")
 @ORM\DiscriminatorColumn(name="discr", type="string")

或者选择不同的继承类型

所以整个班级会是这样的:

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 */
abstract class LocationProxy {
    /**
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="De\Gregblog\Receipts\Location", cascade={"ALL"}, fetch="LAZY")
     * @ORM\JoinColumn(name="location_id", referencedColumnName="location_id", nullable=false)
     * 
     * @var Location
     */
    protected $location;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多