установить несколько='false' в форме в отношении многие ко многим symfony2

У меня есть отношения «многие ко многим» между двумя объектами A и B.

Поэтому при добавлении формы, чтобы добавить entityA к entityB, я делаю следующее:

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

И все в порядке.

Но в зависимости от типа поля entityA я иногда хочу установить для параметра «несколько» значение false, поэтому я делаю следующее:

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
но это работает, когда несколько = истина? @DonCallisto Я изучил свои сущности и не нашел никаких аномалий   -  person user2269869    schedule 14.05.2013
comment
Почему вы хотите, чтобы множественное число было ложным?   -  person AlterPHP    schedule 14.05.2013
comment
@user2269869: user2269869: совершенно ясно, что с multiple=true это работает, потому что вы будете передавать ArrayCollection (как и ожидалось), а не один объект   -  person DonCallisto    schedule 14.05.2013
comment
@PéCé, как я уже упоминал, это зависит от значения типа, которое я хочу установить для множественного значения false. всякий раз, когда type‹›a я хочу, чтобы пользователь выбрал только одно значение для entityA. иначе он может выбрать более одного   -  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
Можете ли вы объяснить мне лучше значение средства формы? @DonCallisto   -  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
как это может мне помочь? @ПеСе   -  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

я бы проверил значение entityA в контроллере и в зависимости от него создал разные формы.

в контроллере:

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