ตั้งค่า multiple='false' ในรูปแบบในความสัมพันธ์แบบหลายต่อหลาย symfony2

ฉันมีความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่างสองเอนทิตี A และ B

ดังนั้น เมื่อเพิ่มแบบฟอร์ม เพื่อเพิ่ม entityA ไปยัง entityB ฉันกำลังดำเนินการดังต่อไปนี้:

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

และทุกอย่างก็โอเค

แต่ขึ้นอยู่กับประเภทฟิลด์ของเอนทิตี A บางครั้งฉันต้องการตั้งค่า 'หลายรายการ' เป็นเท็จ ดังนั้นฉันจึงทำสิ่งต่อไปนี้:

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,

        ));
}

สิ่งนี้ทำให้ฉันมีข้อผิดพลาดต่อไปนี้:

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 

ใครสามารถช่วยฉันได้บ้าง?


person user2269869    schedule 14.05.2013    source แหล่งที่มา
comment
คุณแน่ใจหรือว่ามีข้อผิดพลาดเกิดขึ้นที่นี่?   -  person DonCallisto    schedule 14.05.2013
comment
ใช่จริงๆ @DonCallisto   -  person user2269869    schedule 14.05.2013
comment
ฉันเดิมพันไม่ ฉันพนันได้เลยว่าข้อผิดพลาดนั้นเกิดขึ้นกับเอนทิตีของคุณ: คุณคาดว่าจะมี ArrayCollection แต่คุณมีเอนทิตี (วัตถุ) เดียวและสิ่งนี้จะทำให้คุณเกิดปัญหา   -  person DonCallisto    schedule 14.05.2013
comment
แต่มันใช้งานได้เมื่อ multiple=true ? @DonCallisto ฉันตรวจสอบเอนทิตีของฉันแล้วและไม่พบความผิดปกติใด ๆ   -  person user2269869    schedule 14.05.2013
comment
ทำไมคุณถึงต้องการให้หลายรายการเป็นเท็จ?   -  person AlterPHP    schedule 14.05.2013
comment
@ user2269869: ชัดเจนอย่างสมบูรณ์แบบว่าด้วย multiple=true มันใช้งานได้ นี่เป็นเพราะคุณจะผ่าน ArrayCollection (ตามที่คาดไว้) และไม่ใช่เอนทิตีเดียว   -  person DonCallisto    schedule 14.05.2013
comment
@ PéCé อย่างที่ฉันพูดถึงมันขึ้นอยู่กับค่าของประเภทที่ฉันต้องการตั้งค่าหลายรายการเป็นเท็จ เมื่อใดก็ตามที่พิมพ์‹>a ฉันต้องการให้ผู้ใช้เลือกเพียงค่าเดียวสำหรับเอนทิตี A มิฉะนั้นเขาอาจจะเลือกมากกว่าหนึ่งคน   -  person user2269869    schedule 14.05.2013
comment
@DonCallisto จะทำให้ค่าเดียวผ่านไปเป็น arrayCollection ได้อย่างไร   -  person user2269869    schedule 14.05.2013
comment
@ user2269869: ถ้าคุณใช้สิ่งอำนวยความสะดวกในรูปแบบ symfony2 ฉันคิดว่าคุณต้องสร้างทุกสิ่งในวิธีที่เหมาะสมและไม่ต้องแฮ็กสิ่งเหล่านี้   -  person DonCallisto    schedule 14.05.2013
comment
คุณช่วยอธิบายความหมายของสิ่งอำนวยความสะดวกในรูปแบบให้ดีขึ้นได้ไหม @ดอนคัลลิสโต   -  person user2269869    schedule 14.05.2013
comment
ฉันหมายความว่าหากคุณใช้เอนทิตี ประเภทแบบฟอร์ม และอื่นๆ ฉันคิดว่าคุณไม่ต้องทำอะไรเลย นอกจากกำหนดค่าให้เหมาะสมแล้ว ฉันบอกคุณว่าเพราะฉันใช้ symfony2 มาประมาณ 1 ปีแล้ว และฉันไม่เคยประสบปัญหานี้เลยเพราะกลไกทั้งหมดเป็นแบบอัตโนมัติเสมอ (ยกเว้นบางกรณีที่ฉันต้องเขียนคิวรีแบบกำหนดเองเพื่อเติมรายการแบบเลื่อนลง)   -  person DonCallisto    schedule 14.05.2013
comment
ขอบคุณมากสำหรับคำตอบที่รวดเร็วของคุณ @DonCallisto   -  person user2269869    schedule 14.05.2013
comment
คุณสามารถจัดการกับข้อ จำกัด ในการตรวจสอบความถูกต้องในคอลเลกชัน: symfony.com/doc/2.1/reference /constraints/Count.html   -  person AlterPHP    schedule 14.05.2013
comment
นั่นจะช่วยฉันได้อย่างไร? @PéCé   -  person user2269869    schedule 14.05.2013
comment
ลืมไปว่าฉันคิดผิด!   -  person AlterPHP    schedule 15.05.2013


คำตอบ (2)


ใน EntityA คุณมีอะไรแบบนี้ใช่ไหม?

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

ขณะนี้เนื่องจากคุณสามารถรับค่าเดียวแทนอาร์เรย์ของค่าได้ คุณจึงจำเป็นต้องมีสิ่งนี้:

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

ฉันจะตรวจสอบค่า enterA ในคอนโทรลเลอร์และขึ้นอยู่กับว่ามันจะสร้างแบบฟอร์มที่แตกต่างกัน

ในตัวควบคุม:

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
ฉันยังคงมีข้อความแสดงข้อผิดพลาดเดิมเมื่อลองทำสิ่งนี้ @ลอรีนาส - person user2269869; 14.05.2013
comment
สิ่งนี้ไม่สามารถเป็นจริงได้ FormA และ FormB เป็นแบบฟอร์มอิสระสองรูปแบบที่ควรประมวลผลต่างกัน ดังนั้นจึงไม่มีข้อผิดพลาดปรากฏขึ้น - person Laurynas Mališauskas; 18.05.2013