2016-09-06 3 views
2

Я пытаюсь управлять списком Thing с любой Thing есть name и amount:Упорно автономный CollectionType (добавить/удалить)

Лицо,

class Thing 
{ 
    // ... 

    /** 
    * @var string 
    * 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer") 
    */ 
    private $amount; 
} 

Форма

class ThingFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('amount') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver 
      ->setDefaults(array(
       'data_class' => Thing::class, 
      )) 
     ; 
    } 
} 

Форма сбора

class ThingsFormType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'entry_type' => ThingFormType::class, 
      'allow_delete' => true, 
      'allow_add' => true, 
     )); 
    } 

    public function getParent() 
    { 
     return CollectionType::class; 
    } 
} 

Испытание

$things = array(
    $this->getReference('thing1'), // My Fixtures 
    $this->getReference('thing2'), // 
); 
$form = $this->formFactory->create(ThingsFormType::class, $things); 
$serializedForm = FormHelper::serializeForm($form); 
unset($serializedForm[0]);   // Removing 
$serializedForm[1]['name'] = 'Stuff'; // Updating 
$serializedForm[2] = array(   // Adding 
    'name' => 'Chouette', 
    'amount' => 42, 
); 
$form->submit($serializedForm); 
$this->assertTrue($form->isValid()); 
$this->em->flush(); 

Как вы можете видеть, я удаление Thing0, обновление 1 и добавление нового 2.

Форма успешно связана, и я вижу, что мой новый набор объектов хорошо сформирован, однако я получаю только UPDATE d 1 во время промывки.

Как я могу заставить Doctrine заметить добавленные и удаленные?

Я бы предпочел не просматривать всю коллекцию, чтобы сделать проверку, если это возможно.

ответ

0

Так как я на самом деле не нужно ничего удалять после всего, вот что я сделал в основном:

function updateThings(array $things) { 
    foreach ($things as $thing) { 
     $this->em->persist($thing); 
    } 
    $this->em->flush(); 
} 

В другой стороны, я быстро посмотрел на PersistentCollection, который, кажется, есть некоторые встроенные механизмы синхронизации (getSnapshot() , getDeleteDiff(), ...), но также, судя по всему, зависит от отношения сущности (getOwner()) и не нашел никакой информации об автономном использовании.