Symfony2表单生成器通过元数据选择加入表 [英] Symfony2 Form Builder Select Across Join Table with Metadata

查看:111
本文介绍了Symfony2表单生成器通过元数据选择加入表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3个实体:

  [Member] ---- OneToMany ----> [MemberCategory] ​​--- ManyToOne ---> [类别] 

从数据库中获取结果的效果很好,但是我无法得到表单生成器构建一个正确的表单控件。



我想要一个所有类别的列表,复选框被检查成员使用的类别。最终我想添加优先级字段。



会员

 $ code $ class 
{
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;
}

会员分类

  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;
}

不要工作。



如果我使用:

  $ builder - > add('categories','entity',array(
'class'=>'SMWMemberBundle:Category',
' ty'=>'categoryName',
'multiple'=> true,
'expanded'=> true,
'required'=>假
));

我获得了所有类别的选择,但没有为该成员在MemberCategory中选择。



如果我使用:

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

我为所有用户获取所有选定的类别。有没有人知道如何使这个工作,这是关系数据中的一个明显的常见模式,使用SQL和PHP将很容易。



Symfony 2.3和Doctrine中是否有一个直接的解决方案?

解决方案

这是我如何解决这个问题在过去(适用于你的例子),但这是我想出来的,所以可能不是100%适合你的情况。



首先创建一个 MemberCategory 符合您需求的表单类型:

 <?php 
命名空间Company\YourBundle\Form\Type;

使用Symfony\Component\Form\AbstractType;
使用Symfony\Component\Form\FormBuilderInterface;
使用Symfony\Component\OptionsResolver\OptionsResolverInterface;

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'=> Company\YourBundle\Entity\MemberCategory'
));
}

public function getName()
{
return'company_yourbundle_membercategorytype';
}
}

然后在您的会员类型表单:

 <?php 

命名空间Company\YourBundle\Form\Type;

使用Symfony\Component\Form\AbstractType;
使用Symfony\Component\Form\FormBuilderInterface;
使用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';
}
}

然后你可以按照文档添加尽可能多的类别,并为每个成员分配一个优先级。


I have 3 entities:

[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.

Member

class Member
{
    protected $id;

    @ORM\OneToMany(targetEntity="MemberCategory", mappedBy="member")
    protected $categories;
}

Category

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

    @ORM\Column(name="priority", type="integer", nullable=true)
    protected $priority;
}

Obvious attempts with the form builder that don't work.

If I use:

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

I get a select with all the categories, but none of those selected in MemberCategory for this member.

If I use:

$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.

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.

Is there a straight forward solution in Symfony 2.3 and Doctrine?

解决方案

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.

First create a MemberCategory form type matching your needs:

<?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', 'entity',
                    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';
    }
}

Then add this form type inside your Member type form:

<?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';
    }
}

Then you can follow the documentation to add as many categories as you want to your members and assigning a priority every time.

这篇关于Symfony2表单生成器通过元数据选择加入表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆