我在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中添加一个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
答案 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实体。