Унаследованные сущности в отношении многие-к-одному - PullRequest
0 голосов
/ 16 декабря 2018

Пример структуры данных в БД:

  • configurator_element:
    • id: 1, name: малый набор, inheritsFrom: ноль, features: ["Feature 1", "Feature 2"]
    • id: 2, name: средний набор, inheritsFrom: 1, features: ["Feature 3"]
    • id: 3, name: большой набор, inheritsFrom: 2, features: ["Feature 4", "Feature 5"]

Я хотел бы создать на стороне ORM механизм, который позволяет автоматически извлекать Element объект со всеми унаследованными объектами.

Таким образом, я хотел бы получить App\Entity\Configurator\Element по ID 3, aby автоматически получает объект, как показано ниже:

  • id: 3
  • name: Большой набор
  • features:
    • «Feature 1»
    • «Feature 2»
    • «Feature 3»
    • «Feature 4»
    • «Feature 5»

В настоящее время я сделал это в своем контроллере, используя:

$features = [];
$inheritance = $element->getInheritsFrom();

while ($inheritance instanceof Element) {
    $features = array_merge($features, $inheritance->getFeatures());
    $inheritance = $inheritance->getInheritsFrom();
}

$features = array_merge($features, $element->getFeatures()->toArray());
$element->setFeatures($features);

Мой класс сущности:

namespace App\Entity\Configurator;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="configurator_element")
 * @ORM\Entity(repositoryClass="App\Repository\Configurator\ElementRepository")
 */
class Element
{    
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var Element|null
     *
     * @ORM\ManyToOne(targetEntity="Element", fetch="EAGER")
     * @ORM\JoinColumn(nullable=true)
     */
    private $inheritsFrom;

    /**
     * @var Feature[]
     *
     * @ORM\OneToMany(targetEntity="Feature", mappedBy="element")
     */
    private $features;

    ...
}

1 Ответ

0 голосов
/ 16 декабря 2018

объекты являются коллекцией массивов. Вместо использования setFeatures вы можете использовать addFeature, removeFeature.так что вам не нужно объединять массив, вы можете добавить функцию в цикл while.также в объекте функции вы можете добавить наследовать

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Element")
 * @ORM\JoinColumn(name="element_id", referencedColumnName="id")
 */
private $element;

в контроллере:

 $features = $this->em->getRepository(App\Entity\Feature)->finAll();
 foreach($features as $feature)
 {
     $elemet->addFeature($feature);
 }
 $this->em->flush();
...