рекурсивная Symfony 3.4 сложная форма embed - PullRequest
0 голосов
/ 27 октября 2018

Имея эту схему:

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;

}

CompanyPerson

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 голосов
/ 27 октября 2018

У вас есть рациональные проблемы в вашем отображении.Вы должны использовать шаблон parent-children внутри Person, а не CompanyPerson.CompanyPerson здесь, это совместное юридическое лицо.Здесь сохраняются такие вещи, как:

  • $dateAdded: дата, на которую было установлено соотношение между Company и Person и Status.

Персона

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, что это поле не сопоставлено со свойством целевой сущности вашей формы.

В вашем случае у вас есть форма CompanyTypeCompany в качестве целевой сущности)и хочу создать все эти вещи за один раз!Таким образом, вы можете добавить несопоставленные поля в форму и захватить тему внутри вашего контроллера и анализировать тему по своему усмотрению.

Используя этот метод, вы должны самостоятельно создавать совместные объекты (например, Company-Person) (снова внутриваш контроллер).

...