持久独立CollectionType(添加/删除)

时间:2016-09-06 14:21:28

标签: php doctrine-orm symfony symfony-forms

我正在尝试管理Thing个列表,任何Thing都有nameamount

实体

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();

如您所见,我删除了Thing 0,更新了1并添加了新的2

表单已成功绑定,我可以看到我的新对象组合良好,但是我在刷新时只得到UPDATE d 1

如何让Doctrine注意添加和删除的内容?

如果可能的话,我宁愿不必浏览整个集合来自行检查。

1 个答案:

答案 0 :(得分:0)

因为我并不是真的需要删除任何东西,所以我主要做的是:

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

另一方面,我很快查看PersistentCollection,它似乎有一些嵌入式同步机制(getSnapshot()getDeleteDiff(),...)但似乎也依赖于实体关系(getOwner())并且没有找到任何"独立使用"关于它的文档。