Рекурсивная вставка сложной формы в Symfony 3.4

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

Рекурсивная вставка сложной формы в Symfony 3.4

Я бы хотел сделать такую ​​форму

Рекурсивная вставка сложной формы в Symfony 3.4

Я не знаю, как мне построить форму.

  • В компании много людей.
  • В компании существует корпоративная иерархия: сотрудник, начальник, подчиненный.
  • У рабочего может быть подчиненный работник. Вот почему я добавил рекурсивную ссылку внутри 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();
    }
}

Я работал над встроенной формой с коллекциями, но я не могу создать эту форму, потому что это не очень сложно для меня.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
173
1

Ответы 1

У вас есть рациональные проблемы при составлении карты. вы должны использовать шаблон родитель-потомок внутри 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) (опять же внутри вашего контроллера).

Привет, спасибо, мутч, я вчера прочитал ваш ответ, но я думаю, потому что у меня нет высокого уровня в symfony, но эта форма для меня настоящая проблема Я изменил объекты, как вы сказали, но я заблокирован для всех форм напишите об этом и как я могу это кодировать. Я чувствую себя там абсолютно нулевым: - /

user3279494 28.10.2018 19:33

Я ответил на ваш вопрос. Пожалуйста, прочтите его внимательно и используйте Официальную документацию Symfony, чтобы реализовать это самостоятельно. Если вам нужна реализация, никто здесь, в Stack Overflow, не реализует ваши потребности.

Pmpr 29.10.2018 08:21

Другие вопросы по теме