【问题标题】:Symfony2 Form Entity OneToMany with only one entity doesn't workSymfony2 Form Entity OneToMany 只有一个实体不起作用
【发布时间】:2016-02-29 19:17:03
【问题描述】:

我有两个表:会话和游戏(一个会话可以有多个游戏)

添加会话后,它会呈现我的游戏表单。但现在我有一个奇怪的行为: 当我使用加载所有会话的 EntityType 表单时,游戏已正确保存在我的数据库中。但是当我只在表单中加载一个会话时,数据库中的 session_id 字段为 NULL。

游戏实体:

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="Session", inversedBy="game")
 * @ORM\JoinColumn(name="session_id")
 */
private $session;

会话实体:

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\OneToMany(targetEntity="Game", mappedBy="session")
 */
private $game;

控制器:

/**
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 * @Route("/session/new")
 */
public function addnewsessionAction(Request $request)
{
    $session = new Session();

    $form = $this->createForm(SessionType::class, $session);
    $form->handleRequest($request);

    if ($form->isSubmitted())
    {
        $em = $this->getDoctrine()->getManager();
        $em->persist($session);
        $em->flush();

        return $this->redirectToRoute('app_game_addnewsessiongame', array('sessionid' => $session->getId()));
    }

    return $this->render(':session:addsession.html.twig', array(
        'form' => $form->createView(),
    ));
}


/**
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 * @Route("/session/{sessionid}/addnewgame")
 */
public function addnewsessiongameAction(Request $request, $sessionid)
{
    $game = new Game();

    $form = $this->createForm(GameType::class, $game, array('sessionid' => $sessionid));
    $form->handleRequest($request);

    if ($form->isSubmitted())
    {
        $em = $this->getDoctrine()->getManager();
        $em->persist($game);
        $em->flush();

        return $this->redirectToRoute('app_game_addnewsessiongame', array('sessionid' => $sessionid));
    }

    return $this->render(':game:addgame.html.twig', array(
        'form' => $form->createView(),
        'sessionid' => $sessionid,
    ));
}

GameType(手动选择会话时游戏插入正确):

$builder
        ->add('session', 'entity', array(
            'class' => 'AppBundle\Entity\Session',
            'query_builder' => function(EntityRepository $er ) use ( $options ) {
                return $er->createQueryBuilder('w');
            },
        ))

GameType(当仅通过控制器提供一个会话时):

        $builder
        ->add('session', 'entity', array(
            'class' => 'AppBundle\Entity\Session',
            'query_builder' => function(EntityRepository $er ) use ( $options ) {
                return $er->createQueryBuilder('w')
                    ->where('w.id = ?1')
                    ->setParameter(1, $options['sessionid']);
            },

如果选择选项 2 仅显示给定实体,但以 NULL 保存在 db 中。即使我再次选择此选项,NULL 也会保存在 db 中。

我想自动保存正确的会话,因此用户不必选择会话。将显示选择表单:hidden with additional 'attr' => array('class' => 'hidden')

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    睡了一夜之后,我得到了解决方案。我把会话实体通过表单扔到游戏实体中

    控制器:

     /**
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     * @Route("/session/{sessionid}/addnewgame")
     */
    public function addnewsessiongameAction(Request $request, $sessionid)
    {
        $game = new Game();
    
        $em = $this->getDoctrine()->getManager();
        $mysession = $em->getRepository('AppBundle:Session')->find($sessionid);
    
        $game->setSession($mysession);
    
        $form = $this->createForm(GameType::class, $game, array('sessionid' => $sessionid));
        $form->handleRequest($request);
    
        if ($form->isSubmitted())
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($game);
            $em->flush();
    
            return $this->redirectToRoute('app_game_addnewsessiongame', array('sessionid' => $sessionid));
        }
    
        return $this->render(':game:addgame.html.twig', array(
            'form' => $form->createView(),
            'sessionid' => $sessionid,
        ));
    }
    

    游戏类型:

    $builder->add('session','entity', array('class' => 'AppBundle\Entity\Session','attr' => array('class' => 'hidden')))
    

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 2023-03-11
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多