EntityType:即使未设置选项,也会收取所有可用值

时间:2017-01-24 12:47:36

标签: php forms symfony entity

我在Symfony中运行了三个实体:

专业

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

    /**
     * @ORM\OneToMany(targetEntity="TurnsProfessional", mappedBy="professional")
     */
    private $turns;

}

打开

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

    /**
     * @ORM\OneToMany(targetEntity="TurnsProfessional", mappedBy="turn")
     */
    private $professionals;

}

TurnsProfessionals

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

    /**
     * @ORM\ManyToOne(targetEntity="Turn", inversedBy="professionals")
     * @ORM\JoinColumn(name="turn_id", referencedColumnName="id")
     */
    private $turn;

    /**
     * @ORM\ManyToOne(targetEntity="Professional", inversedBy="turns")
     * @ORM\JoinColumn(name="professional_id", referencedColumnName="id")
     */
    private $professional;

    /**
     * @ORM\Column(type="boolean")
     */
    private $status;

}

在FormType中我有这个:

->add('turns', 'entity',
     array('class' => 'AppBundle:TurnsProfessional',
          'property' => 'label',
          'multiple' => true,
          'expanded' => true,
));

我想要做的是加载“Turn”实体中的所有“转弯”(周一早上,周一晚上,周二早上等)并在表单中显示它们像复选框一样。如果选中转弯,则转弯将在状态= 1的TurnsProfessional中注册,如果状态= 0则不在。

当我在TurnsProfessional中保存所有状态= 0或状态= 1的转弯时,Symfony会打印所有选项,一切正常。但是,第一次没有为专业人员创建转弯,因此add('turns')方法返回一个没有复选框的空值。

在这种情况下,如何显示Turn实体中的所有可用选项?

谢谢!

更新FormType

我尝试在FormType中添加一个query_builder选项:

->add('turns', EntityType::class,
    array('class' => 'AppBundle:Turn',
        'query_builder' => function (EntityRepository $er) {
             return $er->createQueryBuilder('turn')
                    ->orderBy('turn.id', 'ASC');
        },
          'choice_label' => 'label',
          'multiple'=>true,
          'expanded'=>true,
 ))

现在,表单显示了所有选项,但是当我尝试保存表单时,我收到以下错误:

  

找到AppBundle \ Entity类型的实体\打开关联   AppBundle \ Entity \ Professional#转,但期待   的appbundle \实体\ TurnsProfessional

1 个答案:

答案 0 :(得分:0)

您有一个错误,因为您的实体正在等待TurnsProfessional对象并且您正在尝试为其提供Turn对象。要解决此问题,您不应直接将字段映射到您的实体:

->add('turns', EntityType::class,
    array('class' => 'AppBundle:Turn',
        'query_builder' => function (EntityRepository $er) {
             return $er->createQueryBuilder('turn')
                    ->orderBy('turn.id', 'ASC');
        },
          'choice_label' => 'label',
          'multiple' => true,
          'expanded' => true,
          'mapped' => false
 ))

然后在您的控制器中,您可以访问以下结果:

$turns = $form->get('turns);

但是你必须记住$ turn将只包含你在表单中选择的Turn实体。