PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Един към много към един с атрибути Форма със Symfony 3 / Doctrine

Попаднахте на един от най-трудните проблеми с формите на Symfony. За щастие има добра документация. Позволете ми да обобщя важните стъпки.

Прав сте:Обектът Person трябва да знае за връзката си с PersonJob, ако искате да манипулирате тази връзка от гледна точка на Person. Така че трябва да добавите свойство:

// src/AppBundle/Entity/Person.php
/**
 * @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
 */
private $personJobs;

public function __construct()
{
    $this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}

и след това ще имате във формата тип

// src/AppBundle/Form/PersonType.php
$builder
    ->add('name')
    ->add('firstname')
    ->add('personJobs', CollectionType::class, array(
        'entry_type'   => PersonJobType::class,
        'allow_add' => true,
    )
;

Обърнете внимание на типа на personJobs поле. Тъй като човек може да има много PersonJobs, имате нужда от тип формуляр, който може да обработва колекции. Това е целта на вградения CollectionType (вижте неговата документация! ). Необходим ви е и тип формуляр PersonJobType , така че CollectionType знае как да изгради подформулярите:

class PersonJobType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('comment')
            ->add('datestart', DateTimeType::class)
            ->add('dateend', DateTimeType::class)
            ->add('job') // requires Job::__toString() to be defined!
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\PersonJob'
        ));
    }
}

За целите на отстраняване на грешки променете вашия контролер на

 public function testAction()
 {
    $person = new Person();
    $form = $this->createForm(PersonType::class, $person);
    $form->add('submit', SubmitType::class);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        print '<pre>';
        var_dump($form->getData());
        die();
    }

    return $this->render('default/index.html.twig', [
        'form' => $form->createView(),
    ]);
}

Сега продължете и копирайте и поставете кода на Twig и Javascript от Добавяне и премахване на елементи (трябва да направите дребни промени като замяна на form.emails с form.personJobs ).

Формулярът

Формулярът ще изглежда така

Само формулярът Лице с „Добавяне на друга работа за лице“ връзка:

Добавяне на PersonJob:

Добавяне на нищо PersonJob:

Получените данни

Изпратете формуляра и вижте резултата от var_dump :

object(AppBundle\Entity\Person)#247 (5) {
  ["id":"AppBundle\Entity\Person":private]=>
  NULL
  ["name":"AppBundle\Entity\Person":private]=>
  string(12) "Charles Dude"
  ["firstName":"AppBundle\Entity\Person":private]=>
  string(7) "Charles"
  ["active":"AppBundle\Entity\Person":private]=>
  bool(true)
  ["personJobs":"AppBundle\Entity\Person":private]=>
  object(Doctrine\Common\Collections\ArrayCollection)#248 (1) {
    ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
    array(2) {
      [0]=>
      object(AppBundle\Entity\PersonJob)#962 (6) {
        ["id":"AppBundle\Entity\PersonJob":private]=>
        NULL
        ["comment":"AppBundle\Entity\PersonJob":private]=>
        string(19) "Something important"
        ["datestart":"AppBundle\Entity\PersonJob":private]=> 
        object(DateTime)#1088 (3) { … }
        ["dateend": …] => …
        ["person":"AppBundle\Entity\PersonJob":private]=>
        NULL
        ["job":"AppBundle\Entity\PersonJob":private]=>
        object(AppBundle\Entity\Job)#1171 (2) {
          ["id":"AppBundle\Entity\Job":private]=>
          int(2)
          ["name":"AppBundle\Entity\Job":private]=>
          string(5) "Job 2"
        }
      }
      [1]=> …
  }
}

Две неща остават да бъдат направени:

  1. Задайте person свойство на вложеното PersonJob обекти правилно към новото (но все още несъхранено) лице.

  2. Кажете на Doctrine за новия PersonJob обекти чрез извикване на $em->persist(…) върху тях.

Съответна документация:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 начина за изброяване на всички тригери в PostgreSQL база данни

  2. Динамична колона в оператор SELECT postgres

  3. Postgres уникален многоколонен индекс за таблица за присъединяване

  4. Postgresql Изберете редове, където колона =масив

  5. Как да конфигурирате PostgreSQL с Postgis за изчисляване на разстояния