递归的symfony 3.4复杂形式嵌入

时间:2018-10-27 00:36:32

标签: symfony doctrine symfony-forms symfony-3.4

具有此架构:

enter image description here

我想制作一个这样的表格

enter image description here

我不知道如何构建表格。

  • 公司有很多人。
  • 在公司中,我们具有公司层次结构:员工,老板,下属
  • 一个工人可以有一个下属工人这就是为什么我在company_person内为父子概念链接添加了一个反曲链接。

这里的角色是用来说明工人的角色。

公司

class Company
{
    /**
    * @ORM\Column(type="string", length=45, nullable=true)
    */
    private $name;

    /**
    * @ORM\OneToMany(targetEntity="CompanyPerson", mappedBy="company")
    */
    private $companypersons;
}

人员

class Person
{
    /**
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    private $name;

     /**
     * @ORM\OneToMany(targetEntity="CompanyPerson", mappedBy="person",  cascade={"persist"})
     * @var ArrayCollection
     */
    private $companypersons;
}

状态

class Status
{
    /**
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    private $libelle;

    /**
     * @ORM\OneToMany(targetEntity="CompanyPerson", mappedBy="statut")
     */
    protected $companypersons;

}

公司人员

class CompanyPerson
{
    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $dateAdded;

     /**
      * @ORM\ManyToOne(targetEntity="Company", inversedBy="companypersons", 
        cascade={"persist"})
      */
     private $company;

     /**
     * @ORM\ManyToOne(targetEntity="Person", 
       inversedBy="companypersons", cascade={"persist"})
     */
    private $person;

     /**
     * @ORM\ManyToOne(targetEntity="Status",  
       inversedBy="companypersons", cascade={"persist"})
     */
    private $status;

     /**
     * @ORM\ManyToOne(targetEntity="CompanyPerson", inversedBy="childrens")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="CompanyPerson", mappedBy="parent")
     */
    private $childrens;

    public function __construct(Company $companay= null, Person $person = 
      null, CompanyPerson $parent = null, Status $status = null)
    {
        $this->companay     = $companay;
        $this->person       = $person;
        $this->parent       = $parent;
        $this->status       = $status;
        $this->childrens    = new ArrayCollection();
    }
}

我处理了带有集合的嵌入表单,但是由于它对我来说并不复杂,因此我无法创建该表单。

1 个答案:

答案 0 :(得分:1)

在映射中存在理性问题。您应该在Person而非CompanyPerson中使用父子模式。这里的CompanyPerson是一个联合实体。在那里可以保存诸如:

  • $dateAdded:建立CompanyPersonStatus之间的关系的日期。

人员

class Person
{
    /**
     * @ORM\Column(type="string", length=45, nullable=true)
     */
    private $name;

     /**
     * @ORM\OneToMany(targetEntity="CompanyPerson", mappedBy="person",  cascade={"persist"})
     * @var ArrayCollection
     */
    private $companypersons;

    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="childrens")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Person", mappedBy="parent")
     */
    private $children;
}

请注意,children不应包含s,因为它已经是复数形式。

还请记住在关联的反面对映射定义使用cascade操作。所以

class CompanyPerson
{
    /**
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="companypersons", cascade={"persist"})
     */
    private $company;

    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="companypersons", cascade={"persist"})
     */
    private $person;
}

应该是

class CompanyPerson
{
    /**
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="companypersons")
     */
    private $company;

    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="companypersons")
     */
    private $person;
}

您的问题

避开所谓的复杂表格!您可以在字段中使用mapped=false设置属性。使用此方法,您可能会告诉symfony该字段未映射到表单目标实体的属性。

在您的情况下,您拥有CompanyType表单(以Company作为目标实体),并希望一次性创建所有这些东西!因此,您可以在表单中添加未映射的字段,并在控制器内捕获主题并根据需要解析主题。

使用这种方法,您应该自己(同样在控制器内部)创建联合实体(例如Company-Person)。