sql >> Databáze >  >> RDS >> PostgreSQL

One-to-Many-to-One s atributy Form with Symfony 3 / Doctrine

Narazili jste na jeden z nejtěžších problémů s formuláři Symfony. Naštěstí existuje dobrá dokumentace. Dovolte mi shrnout důležité kroky.

Máte pravdu:Entita Osoba potřebuje vědět o svém vztahu s PersonJob, pokud chcete manipulovat s tímto vztahem z pohledu osoby. Takže musíte přidat vlastnost:

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

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

a pak budete mít ve formuláři typ

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

Poznamenejte si typ personJobs pole. Protože člověk může mít mnoho PersonJobs, potřebujete typ formuláře, který dokáže zpracovávat kolekce. K tomu slouží vestavěný CollectionType (podívejte se na jeho dokumentaci! ). Potřebujete také typ formuláře PersonJobType , takže CollectionType ví, jak vytvořit podformuláře:

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'
        ));
    }
}

Pro účely ladění změňte ovladač na

 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(),
    ]);
}

Nyní pokračujte a zkopírujte a vložte kód Twig a Javascript z Přidávání a odebírání položek (musíte provést drobné změny, jako je nahrazení form.emails s form.personJobs ).

Formulář

Formulář bude vypadat takto

Stačí formulář Osoba s „Přidat další PersonJob“ odkaz:

Přidání PersonJob:

Přidání dalšího PersonJob:

Přijatá data

Odešlete formulář a podívejte se na výstup 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]=> …
  }
}

Zbývá udělat dvě věci:

  1. Nastavte person vlastnost vnořeného PersonJob entity správně na novou (ale dosud netrvalou) osobu.

  2. Řekněte Doctrine o nové PersonJob entity voláním $em->persist(…) na nich.

Příslušná dokumentace:




  1. MySQL negeneruje správné výsledky pomocí parametru data ODBC

  2. Jak ukládat binární data v MySQL

  3. Jak profilovat PostgreSQL databázi?

  4. mysql.connector.errors.ProgrammingError:Selhalo zpracování parametrů formátu; „seznam“ Pythonu nelze převést na typ MySQL