PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Một-nhiều-một với các thuộc tính Biểu mẫu với Symfony 3 / Doctrine

Bạn đã gặp phải một trong những vấn đề khó khăn nhất với biểu mẫu Symfony. May mắn thay, có một số tài liệu tốt. Hãy để tôi tóm tắt các bước quan trọng.

Bạn nói đúng:Thực thể Person cần biết về mối quan hệ của họ với PersonJob nếu bạn muốn điều chỉnh mối quan hệ đó theo quan điểm của Người. Vì vậy, bạn cần thêm thuộc tính:

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

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

và sau đó bạn sẽ có loại biểu mẫu

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

Lưu ý loại personJobs đồng ruộng. Vì một người có thể có nhiều PersonJobs, bạn cần một loại biểu mẫu có thể xử lý các bộ sưu tập. Đây là mục đích của CollectionType tích hợp sẵn (xem tài liệu của nó! ). Bạn cũng cần loại biểu mẫu PersonJobType , để CollectionType biết cách xây dựng các biểu mẫu con:

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

Đối với mục đích gỡ lỗi, hãy thay đổi bộ điều khiển của bạn thành

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

Bây giờ, hãy tiếp tục và sao chép &dán mã Twig và Javascript từ Thêm và Xóa các mục (bạn phải thực hiện các thay đổi nhỏ như thay thế form.emails với form.personJobs ).

Biểu mẫu

Biểu mẫu sẽ giống như

Chỉ là biểu mẫu Người với “Thêm một Người khác” liên kết:

Thêm một PersonJob:

Thêm người ẩn danh PersonJob:

Dữ liệu đã nhận

Gửi biểu mẫu và xem kết quả của 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]=> …
  }
}

Còn hai việc phải làm:

  1. Đặt person thuộc tính của PersonJob lồng nhau các thực thể phù hợp với Người mới (nhưng chưa tồn tại).

  2. Cho Doctrine biết về PersonJob mới các thực thể bằng cách gọi $em->persist(…) trên chúng.

Tài liệu liên quan:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tương đương với bảng mô tả trong PgAdmin3

  2. kiểu dữ liệu npgsql không xác định khi sử dụng nhóm theo

  3. Bỏ kết hợp nhiều mảng song song

  4. Sự cố khôi phục cơ sở dữ liệu Heroku

  5. Di chuyển từ Postgres sang SQL Server 2008