atur multiple='false' dalam bentuk dalam relasi banyak ke banyak symfony2

Saya mempunyai hubungan banyak ke banyak antara dua entitas A dan B.

Jadi ketika menambahkan formulir, untuk menambahkan entityA ke entityB, saya melakukan hal berikut:

$builder          
    ->add('entityAs', 'entity', array(
      'class'    => 'xxxBundle:EntityA',
      'property' => 'name',
      'multiple' => true,
    ));}

Dan semuanya baik-baik saja.

Namun bergantung pada tipe bidang entitasA, terkadang saya ingin menyetel 'multiple' ke false, jadi saya melakukan hal berikut:

if($type=='a'){
    $builder          
        ->add('entityAs', 'entity', array(
          'class'    => 'xxxBundle:entityA',
          'property' => 'name',
          'multiple' => true,
        ));}

else {
    $builder          
        ->add('entityAs', 'entity', array(
          'class'    => 'xxxBundle:entityA',
          'property' => 'name',
          'multiple' => false,

        ));
}

Ini memberi saya kesalahan berikut:

Catchable Fatal Error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be an array, object given, called in C:\wamp\www\Symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 519 and defined in C:\wamp\www\Symfony\vendor\doctrine\common\lib\Doctrine\Common\Collections\ArrayCollection.php line 48 

Adakah yang bisa membantu saya?


person user2269869    schedule 14.05.2013    source sumber
comment
apakah Anda yakin kesalahan itu muncul di sini?   -  person DonCallisto    schedule 14.05.2013
comment
ya sebenarnya @DonCallisto   -  person user2269869    schedule 14.05.2013
comment
Saya yakin tidak. Saya yakin kesalahan itu terjadi pada entitas Anda: Anda berharap memiliki ArrayCollection, tetapi Anda memiliki satu entitas (objek) dan ini akan menyebabkan masalah bagi Anda.   -  person DonCallisto    schedule 14.05.2013
comment
tapi itu berfungsi ketika multiple=true ? @DonCallisto Saya memeriksa entitas saya dan tidak dapat menemukan anomali apa pun   -  person user2269869    schedule 14.05.2013
comment
Mengapa Anda ingin multiple menjadi false ?   -  person AlterPHP    schedule 14.05.2013
comment
@ user2269869: sangat jelas bahwa dengan multiple=true ini berfungsi, ini karena Anda akan meneruskan ArrayCollection (seperti yang diharapkan) dan bukan satu entitas   -  person DonCallisto    schedule 14.05.2013
comment
@ PéCé, seperti yang saya sebutkan, itu tergantung pada nilai tipe yang ingin saya setel multiple ke false. setiap kali mengetik‹›a saya ingin pengguna memilih hanya satu nilai untuk entitasA. kalau tidak, dia boleh memilih lebih dari satu   -  person user2269869    schedule 14.05.2013
comment
@DonCallisto bagaimana cara membuat satu nilai diteruskan sebagai arrayCollection?   -  person user2269869    schedule 14.05.2013
comment
@ user2269869: jika Anda menggunakan fasilitas formulir symfony2, saya kira Anda harus membangun semua hal dengan cara yang benar dan tidak meretas hal-hal seperti itu   -  person DonCallisto    schedule 14.05.2013
comment
dapatkah Anda menjelaskan kepada saya lebih baik arti fasilitas formulir? @DonCallisto   -  person user2269869    schedule 14.05.2013
comment
Maksud saya, jika Anda menggunakan entitas, tipe formulir, dan sebagainya, saya kira Anda tidak perlu melakukan apa pun, selain mengkonfigurasinya dengan cara yang benar. Saya beritahu Anda karena saya menggunakan symfony2 sejak sekitar 1 tahun dan saya tidak pernah mengalami masalah ini karena semua mekanisme selalu otomatis (kecuali beberapa kasus, di mana saya harus menulis permintaan khusus untuk mengisi daftar dropdown)   -  person DonCallisto    schedule 14.05.2013
comment
terima kasih banyak atas jawaban cepat Anda @DonCallisto   -  person user2269869    schedule 14.05.2013
comment
Anda dapat menangani kendala validasi pada Koleksi: symfony.com/doc/2.1/reference /constraints/Count.html   -  person AlterPHP    schedule 14.05.2013
comment
bagaimana itu bisa membantu saya? @PéCé   -  person user2269869    schedule 14.05.2013
comment
lupakan itu, aku salah!   -  person AlterPHP    schedule 15.05.2013


Jawaban (2)


Di EntityA, Anda punya yang seperti ini, bukan?

public function setEntitiesB($data)
{
    $this->entitiesB = $data ;
}

Sekarang karena Anda juga dapat menerima nilai tunggal alih-alih nilai array, Anda memerlukan sesuatu seperti ini:

public function setEntitiesB($data)
{
    if ( is_array($data) ) {
        $this->entitiesB = $data ;
    } else {
        $this->entitiesB->clear() ;
        $this->entitiesB->add($data) ;
    }
}
person Zeljko    schedule 15.05.2013

saya akan memeriksa nilai entitasA di pengontrol dan bergantung padanya membuat bentuk yang berbeda.

di pengontrol:

if ($entityA->getType() == 'a') { 
    $form = new FormB(); // form with multiple true
} else {
    $form = new FormA(); // form with multiple false
}
person Laurynas Mališauskas    schedule 14.05.2013
comment
Saya masih mendapatkan pesan kesalahan yang sama saat mencoba ini. @Laurina - person user2269869; 14.05.2013
comment
ini tidak mungkin benar. FormA dan FormB adalah dua formulir independen yang harus diproses secara berbeda, sehingga tidak ada kesalahan yang muncul. - person Laurynas Mališauskas; 18.05.2013