我有3个实体:
[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category]
这对于从数据库中获取结果很有效,但是我无法让Form Builder构建正确的表单控件.
我想要一个包含复选框的所有类别的列表,这些复选框会针对成员使用的类别进行检查.最终我想添加优先级字段.
会员
class Member { protected $id; @ORM\OneToMany(targetEntity="MemberCategory",mappedBy="member") protected $categories; }
类别
class Category { protected $id; @ORM\Column(name="category_name",type="string",length=50,nullable=false,unique=true) private $categoryName; }
MemberCategory
class MemberCategory { @ORM\Id @ORM\ManyToOne(targetEntity="Member") @ORM\JoinColumns({ @ORM\JoinColumn(name="member_id",referencedColumnName="id",onDelete="CASCADE") private $member; @ORM\Id @ORM\ManyToOne(targetEntity="Category") @ORM\JoinColumns({ @ORM\JoinColumn(name="category_id",onDelete="CASCADE") private $category; @ORM\Column(name="priority",type="integer",nullable=true) protected $priority; }
使用表单生成器的明显尝试不起作用.
如果我使用:
$builder->add('categories','entity',array( 'class' => 'SMWMemberBundle:Category','property' => 'categoryName','multiple' => true,'expanded' => true,'required' => false ));
我得到一个包含所有类别的选择,但没有在MemberCategory中为此成员选择的类别.
如果我使用:
$builder->add('categories',array( 'class' => 'SMWMemberBundle:MemberCategory','property' => 'category.categoryName','required' => false ));
我为所有用户选择了所有选定的类别.
有谁知道如何使它工作,这是关系数据中一个明显的常见模式,使用sql和PHP很容易.
在Symfony 2.3和Doctrine中有直接的解决方案吗?
解决方法
这就是我过去解决这个问题的方法(适用于你的例子),但这是我想出来的,所以它可能不是100%适合你的情况.
首先创建一个符合您需求的MemberCategory表单类型:
<?PHP namespace Company\YourBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class MemberCategoryType extends AbstractType { public function buildForm(FormBuilderInterface $builder,array $options) { $builder ->add('priority') ->add('category',array('property' => 'name','class' => 'CompanyYourBundle:Category')) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Company\YourBundle\Entity\MemberCategory' )); } public function getName() { return 'company_yourbundle_membercategorytype'; } }
然后在您的会员类型表单中添加此表单类型:
<?PHP namespace Company\YourBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; 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' => 'Company\YourBundle\Entity\Member' )); } public function getName() { return 'company_yourbundle_membertype'; } }
然后,您可以按照the documentation为您的成员添加任意数量的类别,并每次分配优先级.