在 EntityType 字段中为 1:N Doctrine 关系选择的空值

Selected null-value for 1:N Doctrine relation in EntityType-field

我收到了涉及风险​​的事件。

我将 Symfony 2.6 和 Doctrine ORM 实体与以下相当象征性的实体一起使用:

class Incident
{
    private $id;
    private $name;
    private $date;
    /**
     * @ORM\ManyToOne(targetEntity="Risk")
     * @ORM\JoinColumn(name="risk_id")
     */
    private $risk;
}

class Risk
{
    private $id;
    private $level;
    private $name;
}

risks-Table 的数据如下:

id  level   name
1   0       none
2   2       low
3   1       very low
4   5       moderate
5   10      high

对于事件,我得到了这样的表单类型:

class IncidentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
[...]
            ->add('risk', 'entity', [
                'class' => 'Model:Risk',
                'property' => 'name',
                'empty_data' => null,
                'empty_value' => 'not assessed',
                'expanded' => true,
                'required' => [true|false](see below),
            ])
[...]
}

所以我的事故风险可以是 'not assessed'。那就是没有风险集的时候(=null)。为了保持我的模型干净,我不希望有一个级别为 -1 且名称为 'not assessed'.

的行

我的表单按预期工作,缺少一个小细节:当 risknull 时,我的单选按钮列表没有选择任何值。无论 'required'-选项的值如何,都会发生这种情况。

对于空值,我得到:

( ) not assessed
( ) none
( ) very low
[...]

我想要:

(x) not assessed
( ) none
( ) very low
[...]

我想这种行为对于(未展开的)下拉字段来说很好。

有没有办法在数据值为 null 时选择我的单选按钮的 'placeholder'/'empty_value' 选项?

对于您的 risk 字段,您应该这样做:

class IncidentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        [...]
            ->add('risk', 'entity', [
                'class' => 'Model:Risk',
                'property' => 'name',
                'empty_data' => null, 
                'empty_value' => 'not assessed', 
                'expanded' => true, 
                'required' => true
            ])
    [...]
    }
}

我刚刚检查过,它有效,当 risk 为空且使用上述代码时,第一个值被选中。注意我添加了 'empty_data' => null, 'empty_value' => 'not assessed', 并删除了 placeholder.

可行,但不是一个好的解决方案...如果您的第一个值是动态的,会发生什么情况?