【问题标题】:recursive symfony 3.4 complex form embed递归 symfony 3.4 复杂形式嵌入
【发布时间】:2019-03-31 18:00:18
【问题描述】:

拥有此架构:

我想做一个这样的表格

我不知道如何构建表单。

  • 一个公司有很多人。
  • 在一家公司中,我们有一个公司层次结构:员工、老板、下属
  • 工人可以有下属工人 这就是为什么我在 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();
    }
}

我使用集合嵌入表单,但我无法创建此表单,因为它对我来说不是很复杂。

【问题讨论】:

    标签: symfony doctrine symfony-forms symfony-3.4


    【解决方案1】:

    您的映射存在理性问题。您应该在 Person 中使用父子模式,而不是 CompanyPersonCompanyPerson 这里是一个联合实体。它可以保留以下内容:

    • $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)。

    【讨论】:

    • 嗨,谢谢你,mutch,我昨天看了你的回答,但我认为因为我在 symfony 中没有高水平,但这种形式对我来说是一个真正的问题,我已经修改了你说的实体但我对所有关于它的表单类型以及我如何编码它都感到困惑。我觉得自己在那里完全为零:-/
    • 我已经回答了你的问题。请仔细阅读并使用 Symfony 官方文档自行实现。如果您正在寻求实现,那么 Stack Overflow 中没有人可以满足您的需求。
    猜你喜欢
    • 2018-10-06
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多