Я могу возобновить свою схему следующим образом: Abstract Block
- это объект с единичным наследованием таблицы ... Abstract struture
& abstract graph
- это superclass
(у меня есть множественная структура и график ... я просто представляю только одну проблему)
я хочу добавить коллекцию из GraphDatum
в каждый graph ...
на первом месте попытаться добавить коллекция в Abstract graph
, но doctrine говорит:
It is illegal to put an inverse side one-to-many or many-to-many association on mapped superclass 'App\Entity\MariaDb\Block\Gr
aph\AbstractGraph#graphData'.
Поэтому я пытаюсь создать черту и включить мою черту во все graph
сущности, но теперь у меня неправильное отображение (думаю, потому что ссылка на реферат, а не конечный класс: /?)
graphDataTrait:
trait graphDataTrait
{
/** @var GraphDatum[]|ArrayCollection */
protected $graphData;
/**
* Extend Constructor
*/
private function initGraphData()
{
$this->graphData = new ArrayCollection();
}
/**
* @param ClassMetadata $metadata
*/
static private function loadMetadataGraphData(ClassMetadata $metadata)
{
$builder = new ClassMetadataBuilder($metadata);
$builder
->createOneToMany('graphData', GraphDatum::class)
->mappedBy('graph')
->fetchLazy()
->build()
;
}
// Adder / remover , ect ...
SimpleP ie:
class SimplePie extends AbstractGraph
{
use graphDataTrait;
/**
* SimplePie constructor.
*/
public function __construct()
{
parent::__construct();
if ( method_exists($this, 'initGraphData' )) {
$this->initGraphData();
}
}
/**
* @param ClassMetadata $metadata
*/
public static function loadMetadata(ClassMetadata $metadata)
{
self::loadMetadataGraphData($metadata);
}
// ....
GraphDatum:
class GraphDatum
{
/** @var int */
protected $id;
/** @var AbstractGraph */
protected $graph;
/** @var string */
protected $name;
/** @var string */
protected $color;
/** @var bool */
protected $ref = false;
/** @var AbstractComputed */
protected $computed;
/**
* @param ClassMetadata $metadata
*/
public static function loadMetadata(ClassMetadata $metadata)
{
$builder = new ClassMetadataBuilder($metadata);
$builder
->setTable('graph_datum')
->setCustomRepositoryClass(AbstractServiceEntityRepository::class)
->createField('id', Types::INTEGER)
->makePrimaryKey()
->generatedValue()
->build()
->createField('name', Types::STRING)
->length(255)
->build()
->createField('color', Types::STRING)
->length(255)
->build()
->createField('ref', Types::BOOLEAN)
->build()
->createManyToOne('computed', AbstractComputed::class)
->inversedBy('graphData')
->build()
->createManyToOne('graph', AbstractGraph::class)
->inversedBy('graphData')
->build()
;
}
// Getter / Setter / ect ...
Так, каков правильный подход, чтобы сделать это?