在多对多关系中一次添加一条记录

时间:2011-12-11 12:34:34

标签: symfony doctrine-orm

我的Symfony2项目中有两个实体“User”和“Team”。 用户可以拥有多个团队,团队可以拥有多个用户。

我现在将球员添加到球队的方式是通过选择框(包含数据库中的所有用户),用户可以选择多个用户,然后单击“保存”将其插入数据库。

我想要两个文本框而不是选择框,因为我不希望登录用户能够看到所有可用的用户(特别是当这个框会变得很长时)

我该怎么做? 所以,2个文本框(我将添加一个jquery自动完成器)和一个保存按钮,将2个用户添加到团队中。

THX。

编辑:

<?php

namespace Tennisconnect\DashboardBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class TeamType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('player_one', 'text', array('property_path' => false))
            ->add('player_two', 'text', array('property_path' => false))
        ;  
    }

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

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Team');
    }
}

ChallengeType:

<?php

namespace Tennisconnect\DashboardBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ChallengeType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('teams', 'collection', array(
                'type' => new TeamType(),
                'allow_add' => true
            ))
            ->add('place')
            ->add('date');
    }

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

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Challenge');
    }
}

2 个答案:

答案 0 :(得分:1)

删除与用户相关的字段,并向TeamType添加两个未绑定的字段,例如

$builder->add('new_member_1', 'text', array('property_path' => false))
        ->add('new_member_2', 'text', array('property_path' => false));

这将在您呈现的表单中显示两个文本字段。然后在控制器中编写一些读取这些字段的逻辑,提取用户并将其添加到您的团队中。

// ... controller action
// first bind request
$form->bindRequest($request);
if ($form->isValid()) {
   // fetch first username
   $username = $form->get('new_member_1')->getData();
   $user = $this->getDoctrine()->getRepository('YourBundle:User')->findOneByUsername($username);
   $team->addUser($user);
   // same for second user
}

这是一个简约的例子。因此,您需要添加一些验证,错误处理等,但它会显示它可能对您有用。

修改

如果您有嵌套的表单类型,则可以通过向您的孩子下载路径来遍历这些元素。

$form->get('outer_type')->get('team_type')->get('new_member_1')->getData();

答案 1 :(得分:1)

这是我从集合中获取数据的方式:

foreach($form->get('teams') as $team_form) 
{
    $player_one = $team_form->get('player_one')->getData();
    $player_two = $team_form->get('player_two')->getData();
}