我正在尝试管理Thing
个列表,任何Thing
都有name
和amount
:
实体
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注意添加和删除的内容?
如果可能的话,我宁愿不必浏览整个集合来自行检查。
答案 0 :(得分:0)
因为我并不是真的需要删除任何东西,所以我主要做的是:
function updateThings(array $things) {
foreach ($things as $thing) {
$this->em->persist($thing);
}
$this->em->flush();
}
另一方面,我很快查看PersistentCollection
,它似乎有一些嵌入式同步机制(getSnapshot()
,getDeleteDiff()
,...)但似乎也依赖于实体关系(getOwner()
)并且没有找到任何"独立使用"关于它的文档。