多对一关系中的继承实体

时间:2018-12-15 22:59:10

标签: php symfony orm doctrine

DB中数据的示例结构:

  • configurator_element
    • id:1,name:小集合,inheritsFrom:空,features:[“功能1”,“功能2”]
    • id:2,name:媒体集,inheritsFrom:1,features:[“功能3”]
    • id:3,name:大集合,inheritsFrom:2,features:[“功能4”,“功能5”]

我想在ORM方面创建一种机制,该机制可以自动提取具有所有继承特征的Element对象。

因此,我想通过ID App\Entity\Configurator\Element来获取3,从而自动获取如下实体:

  • id:3
  • name:大套
  • features
    • “功能1”
    • “功能2”
    • “功能3”
    • “功能4”
    • “功能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 :(得分:0)

功能是数组集合, 除了使用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();