【发布时间】:2017-01-19 09:19:45
【问题描述】:
我的项目中有一个多对多关系,但我想修改我的关系表,因此我将其转换为与另一个实体上的连接表的两个多对一关系。
问题是,当我尝试渲染两个初始实体的复选框组时,我无法使用。
这是我的代码:
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;
...
和连接实体
class TurnsProfessional
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
}
/**
* @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 = 0;
...
我的目标是在专业表单中创建一个带有轮流的复选框列表。我尝试了两件事:
首先我尝试在 ProfessionalType 字段中添加一个 Turn::class:
...
->add('turns', 'entity',
array('class' => 'AppBundle:TurnsProfessional',
'property' => 'label',
'multiple' => true,
'expanded' => true,
));
...
这里的问题是表单没有呈现复选框。否则,如果我更改课程:
...
->add('turns', 'entity',
array('class' => 'AppBundle:Turn',
'property' => 'label',
'multiple' => true,
'expanded' => true,
));
...
表单确实呈现了所有复选框,但发送时出现错误:
找到类型 AppBundle\Entity\打开关联的实体 AppBundle\Entity\Professional#turns,但期待 AppBundle\Entity\TurnsProfessional
我已经按照 Oliver 所说(在 cmets 上)编辑了表格:
->add($builder->create('turns', CollectionType::class, array(
'entry_type' => TurnsProfessionalType::class,
'by_reference' => false,
)));
使用 TurnsProfessionalType
class TurnsProfessionalType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('status')
->add('turn', EntityType::class,
array('class' => 'AppBundle:Turn',
'property' => 'label',
'multiple' => true,
'expanded' => true,
));
}
public function getBlockPrefix()
{
return 'turns_professional_registration_form';
}
public function getName()
{
return $this->getBlockPrefix();
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => TurnsProfessional::class,
));
}
}
现在我将其渲染为:
{% for turn in form.turns %}
<td><div class="checkbox">{{ form_widget(turn.status)}}<label></label></div></td>
{% endfor %}
但我需要将每回合的数据库标签作为标签
有人可以帮忙吗? 谢谢!
【问题讨论】:
-
您应该使用CollectionType 而不是EntityType,并查看how to embed a collection of forms 上的symfony 文档
-
@OlivierC 我应该使用 Turns 还是 TurnsProfessional 的 CollectionType?
-
TurnsProfessionalType 的 CollectionType 具有采用 Turn 实体的 EntityType 字段
-
@OlivierC 谢谢你,我已经设法走这条路,问题是我无法访问转弯的标签,以便能够渲染它。现在我在一个包含所有数据库列的选择上呈现了表单。
-
你的 symfony 版本是什么,所以我可以写一个正确的答案