表单实体类型复选框不删除未选中的项目

Form Entity Type Checkboxes Does Not Remove Unchecked Items

我正在使用两个具有 ManyToMany 关系的实体,Jobsite 有一个工人 属性,反之亦然。我有一个 JobsiteType 表单,它向 select 提出工作人员列表,它与多个 select 一起工作得很好: select 或 unselect 在数据库中传播得很好, 但它在使用复选框时不起作用:unselect 项目不会将其从关系 table 中删除。 我正在使用 Symfony v 2.8,这里有一些细节:

// 实体招聘网站

class Jobsite {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="UserWorker", inversedBy="jobsites", cascade={"all"})
     * @ORM\JoinTable(name="jobsite_worker")
     */
    protected $workers;
...

// 实体工作者

class UserWorker {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="Jobsite", mappedBy="workers", cascade={"all"})
     */
    protected $jobsites;
    ...

// 工作地点类型

    public function buildForm(FormBuilderInterface $builder, array $options) {
        ...
        $builder
            ->add('workers', EntityType::class, array(
                'class' => 'MyBundle:UserWorker',
                'choice_label' => 'name',
                'choices_as_values' => true,
                'by_reference' => false,
                'multiple' => true,
                'expanded' => true,// if false, multiple select is working almost well !
                'label' => 'label.workers',
                'required' => false,
                'choices' => $workers,// list of possible workers
            ))
...

所以有人知道复选框样式(多个+扩展)有什么问题吗?我知道未经检查的输入不会发送任何内容,这是否意味着我必须在表单事件中手动循环工作人员以应用正确的更改?好吧,我还注意到,当没有项目被 selected 时,它不适用于多个 select 框,它可能与相同的 'nothing sended if empty' 效果有关。

嗯,对于多个select,需要检查是否设置了字段,如果没有应用一个空数组作为字段数据,那么数据传播就可以了,空集会从中删除项目关系 table... 但它不解决多个复选框:(

    $builder
        ...
        ->addEventListener( FormEvents::PRE_SUBMIT, function(FormEvent $event) {
                $form = $event->getForm();
                $data = $event->getData();

                // the trick : allow empty selection (reset list)
                if(!isset($data['workers'])){   $data['workers'] = [];}

                $event->setData($data);
            }
        )

编辑正确答案

就像删除空内容的提交标志一样简单

// contoller
$form->submit($request, true);// second arg true is the trick