Doctrine - 使用父实体字段作为自己的

时间:2016-08-27 10:23:04

标签: inheritance doctrine-orm entity extends

我正在尝试为常见情况找到最佳解决方案(所有示例都已简化)。

INTRO

我有一个Record实体,其中包含name字段:

/**
 * @ORM\Entity
 */
class Record
{
    /**
     * @ORM\Column(type="string", length=100);
     */
    protected $name;

    /**
     * Set name
     *
     * @param string $name
     *
     * @return Record
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}

RecordFile实体拥有自己的filename字段:

/**
 * @ORM\Entity
 */
class RecordFile
{
    /**
     * @ORM\Column(type="string", length=200);
     */
    protected $filename;

    /**
     * Set filename
     *
     * @param string $filename
     *
     * @return RecordFile
     */
    public function setFilename($filename)
    {
        $this->filename = $filename;

        return $this;
    }

    /**
     * Get filename
     *
     * @return string
     */
    public function getFilename()
    {
        return $this->filename;
    }
}

问题

我想按如下方式进行处理 - 创建Record实体,设置字段,保留它,然后使用在RecordFile字段上运行的扩展getter提取Record实体。

// Record #1
$record = (new Record())
    ->setName('Test')
;

$em->persist($record);
$em->flush();

$recordFile = $em->getRepository('AppBundle:RecordFile')->find(1);

// Returns formatted 'name' field
$recordFile->getName();

RecordFile应使用name实体的Record字段(基本上是任何字段)并将其格式化以用于某些目的。

/**
 * @ORM\Entity
 */
class RecordFile
{
    // ---

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->formatNameField($this->name);
    }

    // ---
}

这个RecordFile应该以某种方式扩展Record基类,以覆盖它的getters方法,但是仍然应该有自己的字段并访问“base”Record实体字段。

尝试解决方案

1)Doctrine STI CTI(Inheritance mapping documentation) - 但这些映射严格区分数据,我基本上需要在一行中。

2)RecordRecordFile之间的一对多 - 其中记录文件包含自定义getter,例如:

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->formatNameField($this->record->name);
    }

但是如果没有基类的直接扩展,它会有点像黑客。

真的希望有人会调查这个问题(可能在某种程度上是深奥的)。

0 个答案:

没有答案