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

Pet*_*ter 8 forms doctrine symfony symfony-2.3

我有3个实体:

[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category]
Run Code Online (Sandbox Code Playgroud)

这对于从数据库中获取结果很有效,但是我无法使表单生成器构建正确的表单控件.

我想要一个包含复选框的所有类别的列表,这些复选框会针对成员使用的类别进行检查.最终我想添加优先级字段.

会员

class Member
{
    protected $id;

    @ORM\OneToMany(targetEntity="MemberCategory", mappedBy="member")
    protected $categories;
}
Run Code Online (Sandbox Code Playgroud)

类别

class Category
{
    protected $id;

    @ORM\Column(name="category_name", type="string", length=50, nullable=false, unique=true)
    private $categoryName;
}
Run Code Online (Sandbox Code Playgroud)

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", referencedColumnName="id", onDelete="CASCADE")
    private $category;

    @ORM\Column(name="priority", type="integer", nullable=true)
    protected $priority;
}
Run Code Online (Sandbox Code Playgroud)

使用表单生成器的明显尝试无效.

如果我使用:

$builder->add('categories', 'entity', array(
    'class'        => 'SMWMemberBundle:Category',
    'property'     => 'categoryName',
    'multiple'     => true,
    'expanded'     => true,
    'required'     => false
));
Run Code Online (Sandbox Code Playgroud)

我得到一个包含所有类别的选择,但没有在MemberCategory中为此成员选择的那些类别.

如果我使用:

$builder->add('categories', 'entity', array(
    'class'        => 'SMWMemberBundle:MemberCategory',
    'property'     => 'category.categoryName',
    'multiple'     => true,
    'expanded'     => true,
    'required'     => false
));
Run Code Online (Sandbox Code Playgroud)

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

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

在Symfony 2.3和Doctrine中有直接的解决方案吗?

Pie*_*ito 1

您将需要在表单中使用查询构建器

$builder->add('categories', 'entity', array(
        'class' => 'SMWMemberBundle:MemberCategory',
        'property'     => 'category.categoryName',
        'query_builder' => function(EntityRepository $er ) use ( ? ) {
           return $er->createQueryBuilder( ? )

          // your query with a left join probably

         }
        'multiple'     => true,
        'expanded'     => true,
        'required' => false
    ));
Run Code Online (Sandbox Code Playgroud)

请参阅文档以了解正确使用方法。请参阅带有参数的 symfony2 表单查询构建器示例