>我有两个表:会话和游戏(一个会话可以有多个游戏)
添加会话后,它会呈现我的游戏形式。但现在我有一个奇怪的行为:当我使用加载所有会话的实体类型表单时,游戏将正确保存在我的数据库中。但是当我只在表单中加载一个会话时,数据库中的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,
));
}
游戏类型(手动选择会话时正确插入的游戏):
$builder
->add('session', 'entity', array(
'class' => 'AppBundle'Entity'Session',
'query_builder' => function(EntityRepository $er ) use ( $options ) {
return $er->createQueryBuilder('w');
},
))
游戏类型(当通过控制器只提供一个会话时):
$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']);
},
在两个情况下,选择选项仅显示给定的实体,但以 NULL 保存在数据库中。即使我再次选择一个选项,NULL 也会保存在 db 中。
我想自动保存正确的会话,这样用户就不必选择会话。选择表单将显示:隐藏,附加"attr" =>数组("类" => "隐藏")
经过一夜的充分睡眠,我得到了解决方案。我获取了会话实体并将其通过表单扔到游戏实体中
控制器:
/**
* @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')))