在学说

时间:2016-04-08 16:16:32

标签: php doctrine-orm

我试图扩展一个用作教义实体的类,但由于某种原因我不断收到错误:

  

没有列名称' location_id'在表格' admin_subdivisions'

当我说扩展时,我的意思是在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;
}

1 个答案:

答案 0 :(得分:0)

您必须指定继承类型,以便doctrine知道如何为子类构建表: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;
}