sql >> データベース >  >> RDS >> PostgreSQL

属性を持つ1対多対1Symfony3/Doctrineを使用したフォーム

    あなたはSymfonyフォームで最も難しい問題の1つに遭遇しました。幸いなことに、いくつかの優れたドキュメントがあります。重要な手順を要約します。

    その通りです。Personの観点からその関係を操作する場合、PersonはPersonJobとの関係について知る必要があります。したがって、プロパティを追加する必要があります:

    // 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のタイプに注意してください 分野。人は多くのPersonJobを持つことができるため、コレクションを処理できるフォームタイプが必要です。これが組み込みの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(),
        ]);
    }
    

    次に、アイテムの追加と削除form.emailsの置き換えなどの小さな変更を加える必要があります form.personJobsを使用 。

    フォーム

    フォームは次のようになります

    「別のPersonJobを追加」を含むPersonフォームのみ リンク:

    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]=> …
      }
    }
    

    やるべきことが2つ残っています:

    1. personを設定します ネストされたPersonJobのプロパティ エンティティは新しい(ただしまだ永続化されていない)人に適切に割り当てられます。

    2. 新しいPersonJobについてDoctrineに伝えます $em->persist(…)を呼び出すことによるエンティティ それらに。

    関連ドキュメント:




    1. mysqlの一時テーブルをクリーンアップするにはどうすればよいですか?

    2. MySQLでADO.NETDbProviderFactoryを使用するにはどうすればよいですか?

    3. CONV()–MySQLの異なるベース間で数値を変換する

    4. Oracleイベントカウントクエリ