Пример структуры данных в БД:
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;
...
}