以 symfony 形式向实体添加 none 值

Adding none value to entity in symfony form

在 Symfony 表单中,我有一个名为 slot 的字段,它匹配具有自定义查询的实体。让我们这样说:

->add('slot', 'entity', array(
    'label'             => 'Slot',
    'class'             => 'FooBarBundle:Slot',
    'property'          => 'name',
    'required'          => false,
    'query_builder'     => function(\Foo\BarBundle\Entity\SlotRepository $er) use ($ids) {
        return $er->createQueryBuilder('u')
            ->where('u.id IN(:ids)')->setParameter('ids', $ids);
    }
))

到目前为止一切正常。 slotManyToOne 匹配 Team 实体(表单是针对该实体)的,因此一次只能有一个插槽 selected。正如我所说,一切都按计划进行。用户可以 select 一个插槽并保存它,每个人都很高兴。

当您尝试 "unselect" 插槽时,麻烦就开始了(是的,这必须是可能的)。所以我需要添加一个 none 值,并带有 None of the listed items 之类的标题。问题是我该怎么做?

选择字段(entity 字段扩展)在 Symfony 表单中呈现的方式是由某种逻辑定义的(documentation). I'm guessing that you're rendering a <select> dropdown, in which case if you're using Symfony 2.6 or above, placeholder is what you want (documentation)。但是请注意,对于某些数据库(例如 Postgres),placeholder 选项在 Symfony 2.7.0 和(我认为)2.7.1.

中被破坏

表单的 empty_data / empty_value 问题是长期混淆的一部分。简而言之,使用 placeholder.

你应该使用 empty_dataempty_value:

->add('slot', 'entity', array(
    'label'             => 'Slot',
    'class'             => 'FooBarBundle:Slot',
    'property'          => 'name',
    'required'          => false,
    'query_builder'     => function(\Foo\BarBundle\Entity\SlotRepository $er) use ($ids) {
        return $er->createQueryBuilder('u')
            ->where('u.id IN(:ids)')->setParameter('ids', $ids);
    },

    'empty_data'  => null,
    'empty_value' => 'None of the listed items' /* or null */
))