OneToMany <=> ManyToOne в MappedSuperClass - PullRequest
0 голосов
/ 24 января 2020

Я могу возобновить свою схему следующим образом: schema bdd 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 ...

Так, каков правильный подход, чтобы сделать это?

...