Php 带有筛选实体的Symfony2子窗体集合删除当前实体

Php 带有筛选实体的Symfony2子窗体集合删除当前实体,php,forms,symfony,entity,subform,Php,Forms,Symfony,Entity,Subform,对不起,我是法国人!我会尽力解释我的问题 上下文 我想为一场足球比赛创建比赛报告,每个队长都可以使用统计数据(进球、助攻等)添加或删除自己球队的球员 问题 一切都在为一名队长工作,我可以添加/删除成功记录在数据库中的球员,只有当前队长所在球队的球员。但是,当另一个想要这样做时,子窗体会显示我以前记录的统计数据,但带有团队名称。。。如果我进行验证,数据库中的行将被新播放器的名称覆盖 示例:我与我的球员“Player1”一起输入结果,他得分两次!当我保存时,一切都完美地保存在数据库中。 当我想和第二

对不起,我是法国人!我会尽力解释我的问题

上下文 我想为一场足球比赛创建比赛报告,每个队长都可以使用统计数据(进球、助攻等)添加或删除自己球队的球员

问题 一切都在为一名队长工作,我可以添加/删除成功记录在数据库中的球员,只有当前队长所在球队的球员。但是,当另一个想要这样做时,子窗体会显示我以前记录的统计数据,但带有团队名称。。。如果我进行验证,数据库中的行将被新播放器的名称覆盖

示例:我与我的球员“Player1”一起输入结果,他得分两次!当我保存时,一切都完美地保存在数据库中。 当我想和第二个队长做同样的事情时,我的球员“Player2”进了一个球。先前保存的行被player2的数据覆盖

代码 这是我的密码

控制器简化

    $em = $this->getDoctrine()->getManager();
    $match = $em->getRepository('OCPlatformBundle:Matchs')->findOneById($id);
    $form = $this->get('form.factory')->create(new MatchType(), $match);

    $form->handleRequest($request);

    //VERIF FEUILLE DE MATCH
    foreach($match->getStatsplayer() as $player){
            $player->setDefcleansheet(false);
            $player->setGkcleansheet(false);
            $player->setGame($match);
            $player->setClub($user->getClub());
    }

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($match);

        $em->flush();
MatchType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
      ->add('homescore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('awayscore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('statsplayer', 'collection', array(
            'type'         => new StatsType(),
            'allow_add'    => true,
            'allow_delete' => true))
      ->add('save',      'submit')
    ;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    //Players to show is filtered with the querybuilder
    $builder
      ->add('player', 'entity', array(
        'class' => 'OCUserBundle:User',
        'property' => 'username',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                global $kernel;
                $user = $kernel->getContainer()->get('security.context')->getToken()->getUser();
                return $er->createQueryBuilder('q')
                ->where('q.club = :pf')
                ->orderBy('q.club', 'ASC')
                ->setParameter('pf', $user->getClub());
            },
        'required' => true, 
        'label' => false,
        ))
      ->add('goals', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'goals', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'goals'
            )))
      ->add('assists', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'assists', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'assists'
            )))
/**
* Matchs
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\MatchsRepository")
*/
class Matchs
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="competition", type="integer")
 */
private $competition; 

/**
 * @var integer
 *
 * @ORM\Column(name="phase", type="integer")
 */
private $phase;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="datemax", type="datetime")
 */
private $datemax;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $home;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $away;

/**
 * @var integer
 *
 * @ORM\Column(name="homescore", type="integer")
 */
private $homescore;

/**
 * @var integer
 *
 * @ORM\Column(name="awayscore", type="integer")
 */
private $awayscore;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="dateevent", type="datetime")
 */
private $dateevent;

/**
 * @ORM\OneToMany(targetEntity="OC\PlatformBundle\Entity\Stats", mappedBy="game", cascade={"persist"})
 * @Assert\Valid
 */
private $statsplayer;
/**
* Stats
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\StatsRepository")
* @UniqueEntity({"player","game"})
*/
class Stats
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="OC\UserBundle\Entity\User", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $player;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\JoinColumn(nullable=false)
 */
private $club;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Matchs", inversedBy="statsplayer", cascade={"persist"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="game_id", referencedColumnName="id")
 * })
 */
private $game;

/**
 * @var integer
 *
 * @ORM\Column(name="goals", type="integer")
 */
private $goals;

/**
 * @var integer
 *
 * @ORM\Column(name="assists", type="integer")
 */
private $assists;

/**
 * @var boolean
 *
 * @ORM\Column(name="yellowcard", type="boolean")
 */
private $yellowcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="redcard", type="boolean")
 */
private $redcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="defcleansheet", type="boolean")
 */
private $defcleansheet;

/**
 * @var boolean
 *
 * @ORM\Column(name="gkcleansheet", type="boolean")
 */
private $gkcleansheet;
statstType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
      ->add('homescore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('awayscore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('statsplayer', 'collection', array(
            'type'         => new StatsType(),
            'allow_add'    => true,
            'allow_delete' => true))
      ->add('save',      'submit')
    ;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    //Players to show is filtered with the querybuilder
    $builder
      ->add('player', 'entity', array(
        'class' => 'OCUserBundle:User',
        'property' => 'username',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                global $kernel;
                $user = $kernel->getContainer()->get('security.context')->getToken()->getUser();
                return $er->createQueryBuilder('q')
                ->where('q.club = :pf')
                ->orderBy('q.club', 'ASC')
                ->setParameter('pf', $user->getClub());
            },
        'required' => true, 
        'label' => false,
        ))
      ->add('goals', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'goals', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'goals'
            )))
      ->add('assists', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'assists', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'assists'
            )))
/**
* Matchs
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\MatchsRepository")
*/
class Matchs
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="competition", type="integer")
 */
private $competition; 

/**
 * @var integer
 *
 * @ORM\Column(name="phase", type="integer")
 */
private $phase;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="datemax", type="datetime")
 */
private $datemax;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $home;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $away;

/**
 * @var integer
 *
 * @ORM\Column(name="homescore", type="integer")
 */
private $homescore;

/**
 * @var integer
 *
 * @ORM\Column(name="awayscore", type="integer")
 */
private $awayscore;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="dateevent", type="datetime")
 */
private $dateevent;

/**
 * @ORM\OneToMany(targetEntity="OC\PlatformBundle\Entity\Stats", mappedBy="game", cascade={"persist"})
 * @Assert\Valid
 */
private $statsplayer;
/**
* Stats
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\StatsRepository")
* @UniqueEntity({"player","game"})
*/
class Stats
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="OC\UserBundle\Entity\User", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $player;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\JoinColumn(nullable=false)
 */
private $club;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Matchs", inversedBy="statsplayer", cascade={"persist"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="game_id", referencedColumnName="id")
 * })
 */
private $game;

/**
 * @var integer
 *
 * @ORM\Column(name="goals", type="integer")
 */
private $goals;

/**
 * @var integer
 *
 * @ORM\Column(name="assists", type="integer")
 */
private $assists;

/**
 * @var boolean
 *
 * @ORM\Column(name="yellowcard", type="boolean")
 */
private $yellowcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="redcard", type="boolean")
 */
private $redcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="defcleansheet", type="boolean")
 */
private $defcleansheet;

/**
 * @var boolean
 *
 * @ORM\Column(name="gkcleansheet", type="boolean")
 */
private $gkcleansheet;
}

谢谢你的帮助

编辑:

我的实体:

Matchs.php

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
      ->add('homescore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('awayscore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('statsplayer', 'collection', array(
            'type'         => new StatsType(),
            'allow_add'    => true,
            'allow_delete' => true))
      ->add('save',      'submit')
    ;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    //Players to show is filtered with the querybuilder
    $builder
      ->add('player', 'entity', array(
        'class' => 'OCUserBundle:User',
        'property' => 'username',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                global $kernel;
                $user = $kernel->getContainer()->get('security.context')->getToken()->getUser();
                return $er->createQueryBuilder('q')
                ->where('q.club = :pf')
                ->orderBy('q.club', 'ASC')
                ->setParameter('pf', $user->getClub());
            },
        'required' => true, 
        'label' => false,
        ))
      ->add('goals', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'goals', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'goals'
            )))
      ->add('assists', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'assists', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'assists'
            )))
/**
* Matchs
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\MatchsRepository")
*/
class Matchs
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="competition", type="integer")
 */
private $competition; 

/**
 * @var integer
 *
 * @ORM\Column(name="phase", type="integer")
 */
private $phase;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="datemax", type="datetime")
 */
private $datemax;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $home;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $away;

/**
 * @var integer
 *
 * @ORM\Column(name="homescore", type="integer")
 */
private $homescore;

/**
 * @var integer
 *
 * @ORM\Column(name="awayscore", type="integer")
 */
private $awayscore;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="dateevent", type="datetime")
 */
private $dateevent;

/**
 * @ORM\OneToMany(targetEntity="OC\PlatformBundle\Entity\Stats", mappedBy="game", cascade={"persist"})
 * @Assert\Valid
 */
private $statsplayer;
/**
* Stats
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\StatsRepository")
* @UniqueEntity({"player","game"})
*/
class Stats
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="OC\UserBundle\Entity\User", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $player;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\JoinColumn(nullable=false)
 */
private $club;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Matchs", inversedBy="statsplayer", cascade={"persist"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="game_id", referencedColumnName="id")
 * })
 */
private $game;

/**
 * @var integer
 *
 * @ORM\Column(name="goals", type="integer")
 */
private $goals;

/**
 * @var integer
 *
 * @ORM\Column(name="assists", type="integer")
 */
private $assists;

/**
 * @var boolean
 *
 * @ORM\Column(name="yellowcard", type="boolean")
 */
private $yellowcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="redcard", type="boolean")
 */
private $redcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="defcleansheet", type="boolean")
 */
private $defcleansheet;

/**
 * @var boolean
 *
 * @ORM\Column(name="gkcleansheet", type="boolean")
 */
private $gkcleansheet;
Stats.php

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
      ->add('homescore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('awayscore', 'choice', array('choices'   => array(0,1,2,3,4,5,6,7,8,9,10,11,12)))
      ->add('statsplayer', 'collection', array(
            'type'         => new StatsType(),
            'allow_add'    => true,
            'allow_delete' => true))
      ->add('save',      'submit')
    ;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    //Players to show is filtered with the querybuilder
    $builder
      ->add('player', 'entity', array(
        'class' => 'OCUserBundle:User',
        'property' => 'username',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                global $kernel;
                $user = $kernel->getContainer()->get('security.context')->getToken()->getUser();
                return $er->createQueryBuilder('q')
                ->where('q.club = :pf')
                ->orderBy('q.club', 'ASC')
                ->setParameter('pf', $user->getClub());
            },
        'required' => true, 
        'label' => false,
        ))
      ->add('goals', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'goals', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'goals'
            )))
      ->add('assists', 'choice', array(
                    'choices'   => array(0,1,2,3,4,5,6,7),
                    'label' => 'assists', 'translation_domain' => 'FOSUserBundle', 'attr' => array(
                'placeholder' => 'assists'
            )))
/**
* Matchs
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\MatchsRepository")
*/
class Matchs
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="competition", type="integer")
 */
private $competition; 

/**
 * @var integer
 *
 * @ORM\Column(name="phase", type="integer")
 */
private $phase;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="datemax", type="datetime")
 */
private $datemax;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $home;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\Joincolumn(nullable=false)
 */
private $away;

/**
 * @var integer
 *
 * @ORM\Column(name="homescore", type="integer")
 */
private $homescore;

/**
 * @var integer
 *
 * @ORM\Column(name="awayscore", type="integer")
 */
private $awayscore;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="dateevent", type="datetime")
 */
private $dateevent;

/**
 * @ORM\OneToMany(targetEntity="OC\PlatformBundle\Entity\Stats", mappedBy="game", cascade={"persist"})
 * @Assert\Valid
 */
private $statsplayer;
/**
* Stats
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Entity\StatsRepository")
* @UniqueEntity({"player","game"})
*/
class Stats
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="OC\UserBundle\Entity\User", cascade={"persist"})
 * @ORM\JoinColumn(nullable=false)
 */
private $player;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Club")
 * @ORM\JoinColumn(nullable=false)
 */
private $club;

/**
 * @ORM\ManyToOne(targetEntity="OC\PlatformBundle\Entity\Matchs", inversedBy="statsplayer", cascade={"persist"})
 * @ORM\JoinColumns({
 *  @ORM\JoinColumn(name="game_id", referencedColumnName="id")
 * })
 */
private $game;

/**
 * @var integer
 *
 * @ORM\Column(name="goals", type="integer")
 */
private $goals;

/**
 * @var integer
 *
 * @ORM\Column(name="assists", type="integer")
 */
private $assists;

/**
 * @var boolean
 *
 * @ORM\Column(name="yellowcard", type="boolean")
 */
private $yellowcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="redcard", type="boolean")
 */
private $redcard;

/**
 * @var boolean
 *
 * @ORM\Column(name="defcleansheet", type="boolean")
 */
private $defcleansheet;

/**
 * @var boolean
 *
 * @ORM\Column(name="gkcleansheet", type="boolean")
 */
private $gkcleansheet;

我们可以看到没有getter和setter的实体吗?这样我们就可以看到数据库布局了吗?这里是:)@FrankbeenCan您可以展示表单模板和javascript来处理集合字段吗?看起来你正在编辑同一个统计数据实体。不,这不是我以前检查过的问题。但它看起来像是原型的“标签名”决定了将什么放入数据库中。如果我不在StatsType.php中过滤实体,一切正常。。。