问题描述
我有 3 个实体:
[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category]
就从数据库中获取结果而言,这很有效,但我无法让表单生成器构建正确的表单控件.
This works well as far as fetching results from the database, but I can't get the Form Builder to build a correct form controls.
我想要一个所有类别的列表,其中包含针对会员使用的类别选中的复选框.最终我想添加优先级字段.
I want a list of all categories with checkboxes that are checked for those categories that are used by the member. Eventually I want to add the priority field.
会员
class Member
{
protected $id;
@ORMOneToMany(targetEntity="MemberCategory", mappedBy="member")
protected $categories;
}
类别
class Category
{
protected $id;
@ORMColumn(name="category_name", type="string", length=50, nullable=false, unique=true)
private $categoryName;
}
会员类别
class MemberCategory
{
@ORMId
@ORMManyToOne(targetEntity="Member")
@ORMJoinColumns({
@ORMJoinColumn(name="member_id", referencedColumnName="id", onDelete="CASCADE")
private $member;
@ORMId
@ORMManyToOne(targetEntity="Category")
@ORMJoinColumns({
@ORMJoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")
private $category;
@ORMColumn(name="priority", type="integer", nullable=true)
protected $priority;
}
使用表单生成器的明显尝试不起作用.
Obvious attempts with the form builder that don't work.
如果我使用:
$builder->add('categories', 'entity', array(
'class' => 'SMWMemberBundle:Category',
'property' => 'categoryName',
'multiple' => true,
'expanded' => true,
'required' => false
));
我得到一个包含所有类别的选择,但没有在 MemberCategory 中为该成员选择的那些.
I get a select with all the categories, but none of those selected in MemberCategory for this member.
如果我使用:
$builder->add('categories', 'entity', array(
'class' => 'SMWMemberBundle:MemberCategory',
'property' => 'category.categoryName',
'multiple' => true,
'expanded' => true,
'required' => false
));
我获得所有用户的所有选定类别.
I get all selected categories for all users.
有谁知道如何让它工作,这是关系数据中明显的常见模式,使用 SQL 和 PHP 很容易.
Does anyone know how to get this to work, this is an obvious common pattern in relational data and would be easy using SQL and PHP.
Symfony 2.3 和 Doctrine 中是否有直接的解决方案?
Is there a straight forward solution in Symfony 2.3 and Doctrine?
推荐答案
这就是我过去解决此问题的方法(应用于您的示例)但这是我想出来的,因此它可能不是 100% 适合您案例.
This is how I resolved this problem in the past (applied to your example) but this is what I figured out so it might not be 100% right for your case.
首先创建一个符合您需要的 MemberCategory
表单类型:
First create a MemberCategory
form type matching your needs:
<?php
namespace CompanyYourBundleFormType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
class MemberCategoryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('priority')
->add('category', 'entity',
array('property' => 'name',
'class' => 'CompanyYourBundle:Category'))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CompanyYourBundleEntityMemberCategory'
));
}
public function getName()
{
return 'company_yourbundle_membercategorytype';
}
}
然后在你的 Member
类型表单中添加这个表单类型:
Then add this form type inside your Member
type form:
<?php
namespace CompanyYourBundleFormType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
class MemberType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('members', 'collection', array(
'type' => new MemberCategoryType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,));
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CompanyYourBundleEntityMember'
));
}
public function getName()
{
return 'company_yourbundle_membertype';
}
}
然后您可以按照文档添加尽可能多的类别您希望您的成员每次都分配一个优先级.
Then you can follow the documentation to add as many categories as you want to your members and assigning a priority every time.
这篇关于Symfony2 表单生成器选择带有元数据的连接表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!