如何扩展无法修改的实体的功能?

时间:2019-01-25 10:17:41

标签: symfony doctrine-orm annotations

我正在使用Symfony 3.3,并且想向实现实体的类中添加一个函数:

/**
 * GeoName
 *
 * @ORM\Table(name="geo__name" ,indexes={
 *     @ORM\Index(name="geoname_geoname_search_idx", columns={"name", "country_code"})
 * })
 * @ORM\Entity(repositoryClass="Bordeux\Bundle\GeoNameBundle\Repository\GeoNameRepository")
 */
class GeoName
{
    ...
}

所以我扩展了该类并添加了所需的功能。

use ...\GeoName as BaseEntity;

class GeoName extends BaseEntity
{
    public function __toString()
    {
        return $this->getName();
    }
}

错误

如果我根本不使用注释,则在使用子类时,系统不会将其识别为实体:

Class "GeoNameBundle\Entity\GeoName" sub class of "Bordeux\Bundle\GeoNameBundle\Entity\GeoName" is not a valid entity or mapped super class.

如果我将子类声明为带有注解@ORM\Entity的实体,则在使用它时,系统会期望两个表,因为它将扩展名作为类模型继承(未正确定义):

An exception occurred while executing 'SELECT t1.id AS id_2, t1.name AS name_3, ...[MORE FIELDS]... FROM geo__name t1 WHERE t0.id = ?' with params [6362055]:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.id' in 'where clause'

如果我无法编辑注释或超类的任何内容(因为它是一个库),并且考虑到我不是真的在尝试实现,该怎么办?模型继承,仅向实现实体的类添加函数。

感谢您的关注和帮助。

1 个答案:

答案 0 :(得分:0)

注释应复制到扩展类:

use ...\GeoName as BaseEntity;

/**
 * @ORM\Table(name="geo__name" ,indexes={
 *     @ORM\Index(name="geoname_geoname_search_idx", columns={"name", "country_code"})
 * })
 * @ORM\Entity(repositoryClass="Bordeux\Bundle\GeoNameBundle\Repository\GeoNameRepository")
 */
class GeoName extends BaseEntity
{
    public function __toString()
    {
        return $this->getName();
    }
}