PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Satu-ke-Banyak-ke-Satu dengan atribut Bentuk dengan Symfony 3 / Doctrine

Anda telah menemukan salah satu masalah tersulit dengan bentuk Symfony. Untungnya, ada beberapa dokumentasi yang bagus. Biarkan saya meringkas langkah-langkah penting.

Anda benar:Entitas Orang perlu tahu tentang hubungannya dengan PersonJob jika Anda ingin memanipulasi hubungan itu dari sudut pandang Orang. Jadi, Anda perlu menambahkan properti:

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

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

dan kemudian Anda akan memiliki jenis formulir

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

Perhatikan jenis personJobs bidang. Karena seseorang dapat memiliki banyak PersonJobs, Anda memerlukan tipe formulir yang dapat menangani koleksi. Ini adalah tujuan dari CollectionType . bawaan (lihat dokumentasinya! ). Anda juga memerlukan jenis formulir PersonJobType , sehingga CollectionType tahu cara membuat sub-formulir:

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

Untuk tujuan debugging, ubah pengontrol Anda menjadi

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

Sekarang lanjutkan dan salin &tempel kode Twig dan Javascript dari Menambahkan dan Menghapus Item (Anda harus membuat perubahan kecil seperti mengganti form.emails dengan form.personJobs ).

Formulir

Bentuknya akan terlihat seperti

Hanya formulir Person dengan “Tambahkan PersonJob lain” tautan:

Menambahkan PersonJob:

Menambahkan PersonJob lain:

Data diterima

Kirim formulir dan lihat output 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]=> …
  }
}

Masih ada dua hal yang harus dilakukan:

  1. Setel person properti dari PersonJob bersarang entitas dengan benar ke Orang baru (tetapi belum bertahan).

  2. Beri tahu Doctrine tentang PersonJob baru entitas dengan memanggil $em->persist(…) pada mereka.

Dokumentasi yang relevan:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membaca sintaks dokumentasi untuk perintah PostgreSQL?

  2. Daftar semua tabel di postgresql information_schema

  3. Fungsi Jendela atau Ekspresi Tabel Umum:hitung baris sebelumnya dalam jangkauan

  4. Bagaimana cara saya mendapatkan dukungan LISTEN/NOTIFY asynchronous/even-driven di Java menggunakan database Postgres?

  5. Segarkan tampilan yang terwujud:Konkurensi, perilaku transaksional