我正在尝试为常见情况找到最佳解决方案(所有示例都已简化)。
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)Record
和RecordFile
之间的一对多 - 其中记录文件包含自定义getter,例如:
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->formatNameField($this->record->name);
}
但是如果没有基类的直接扩展,它会有点像黑客。
真的希望有人会调查这个问题(可能在某种程度上是深奥的)。