表单 – Symfony2表单生成器选择跨元素的连接表

我有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
));

我为所有用户选择了所有选定的类别.

有谁知道如何使它工作,这是关系数据中一个明显的常见模式,使用sqlPHP很容易.

在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为您的成员添加任意数量的类别,并每次分配优先级.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些