Php 多对多和形成Symfony2 我所拥有的

Php 多对多和形成Symfony2 我所拥有的,php,forms,symfony,orm,doctrine-orm,Php,Forms,Symfony,Orm,Doctrine Orm,我有一个数据库表usuario(用户)和一个表perfil(配置文件),与一个perfiles\u usuario(配置文件用户)表连接。多对多关系。我现在可以通过执行以下操作成功地从用户检索配置文件:$perfiles=$usuario->getPerfiles() 我想做什么 我试图创建一个表单,您可以从perfil(profile)表中添加一个或多个现有概要文件。我想有一个多选择字段,并为用户选择配置文件 我想做什么 我的表单生成器 class UsuarioType extends Ab

我有一个数据库表usuario(用户)和一个表perfil(配置文件),与一个perfiles\u usuario(配置文件用户)表连接。多对多关系。我现在可以通过执行以下操作成功地从用户检索配置文件:$perfiles=$usuario->getPerfiles()

我想做什么 我试图创建一个表单,您可以从perfil(profile)表中添加一个或多个现有概要文件。我想有一个多选择字段,并为用户选择配置文件

我想做什么 我的表单生成器

class UsuarioType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder

            ->add('username', 'text', array('required' => false))

            ->add('perfiles', 'entity', array(
                'class' => 'UsuarioBundle:Perfil',
                'em' => 'dynamic_em',
                'query_builder' => function(EntityRepository $er){ 

                    return $er->createQueryBuilder('c')->orderBy('c.nombre', 'ASC');

                }, 
                'required' => false
            ))

        ;
    }
我的看法

<div class="clearfix">
    {{ form_widget(formulario.perfiles, { 'attr': { 'class': 'select-perfiles', 'multiple':'' } }) }} 
</div>
Usuario.php第450行

public function setPerfiles(array $perfiles) // line 450
{
    # Borra los perfiles que tiene el usuario
    $this->getPerfilesCollection()->clear();

    # Asigna los perfiles pasados por parámetro
    foreach ($perfiles as $perfil) {
        $this->addPerfil($perfil);
    }

    return $this;
}
我认为问题在于我的用户操作:

$usuario = new Usuario();
$formulario = $this->crearCrearForm($usuario);
$formulario->handleRequest($request); <--------- ... at this line

第一个问题:setPerfiles的参数实例必须是collection类型(条令接口)
第二个问题:perfiles是一个集合,因此您需要表单中的集合类型和perfiles的表单类型。

非常感谢!这是解决办法

/**
 * Devuelve una coleccion con los perfiles del usuario
 *
 * @return ArrayCollection
 */
function getPerfiles()
{

    $perfiles = $this->getPerfilesCollection(); # ->toArray(); I delete this
    return $perfiles;
}
我也会改变

/**
 * Establece los perfiles del usuario a partir de un ArrayCollection de
 * perfiles
 * 
 * @param ArrayColection
 *
 * @return self
 */
public function setPerfiles(ArrayCollection $perfiles)
{
    // # Borra los perfiles que tiene el usuario
    // $this->getPerfilesCollection()->clear();

    // # Asigna los perfiles pasados por parámetro
    // foreach ($perfiles as $perfil) {
    //     $this->addPerfil($perfil);
    // }

    // return $this;

    $this->getPerfilesCollection()->clear();

    foreach($collection->toArray() as $perfil){
        $this->addPerfil($perfil);
    }
}
在表单生成器中,我只添加了这一行:“multiple'=>true

->add('perfiles', 'entity', array(
            'class' => 'UsuarioBundle:Perfil',
            'multiple' => true, <----------------------
            'em' => 'dynamic_em',
            'query_builder' => function(EntityRepository $er){

                return $er->createQueryBuilder('c')->orderBy('c.nombre', 'ASC');

            }, 
            'required' => false
        ))
->添加('perfiles','entity',数组(
'class'=>'UsuarioBundle:Perfil',
'multiple'=>true'dynamic_em',
“查询生成器”=>函数(EntityRepository$er){
返回$er->createQueryBuilder('c')->orderBy('c.nombre','ASC');
}, 
“必需”=>false
))

我已经阅读了Symfony文档,但我不知道如何获取多选字段“Perfil”(配置文件)的配置文件列表,我可以帮助您!还有一个建议:将ArrayCollection更改为Collection(setPerfiles参数实例)。原因是:有时使用PersistantCollection或Proxy类型的参数调用setter。若你们只是要求集合接口被实现,它将工作,否则你们的应用程序将崩溃。
/**
 * Devuelve una coleccion con los perfiles del usuario
 *
 * @return ArrayCollection
 */
function getPerfiles()
{

    $perfiles = $this->getPerfilesCollection(); # ->toArray(); I delete this
    return $perfiles;
}
/**
 * Establece los perfiles del usuario a partir de un ArrayCollection de
 * perfiles
 * 
 * @param ArrayColection
 *
 * @return self
 */
public function setPerfiles(ArrayCollection $perfiles)
{
    // # Borra los perfiles que tiene el usuario
    // $this->getPerfilesCollection()->clear();

    // # Asigna los perfiles pasados por parámetro
    // foreach ($perfiles as $perfil) {
    //     $this->addPerfil($perfil);
    // }

    // return $this;

    $this->getPerfilesCollection()->clear();

    foreach($collection->toArray() as $perfil){
        $this->addPerfil($perfil);
    }
}
->add('perfiles', 'entity', array(
            'class' => 'UsuarioBundle:Perfil',
            'multiple' => true, <----------------------
            'em' => 'dynamic_em',
            'query_builder' => function(EntityRepository $er){

                return $er->createQueryBuilder('c')->orderBy('c.nombre', 'ASC');

            }, 
            'required' => false
        ))