在 Controller 中使用来自 Query 的数据
Use data from Query in Controller
我必须在我的 Symfony3 项目中更改什么才能通过 Doctrine 正确接收数据?
当我用 ->MyQuery($selName) 替换 -> findOneBy ('name' => $selName)
时,我会收到 FatalThrowableError
:
"Call to a member function getName() on array 500 Internal Server Error"
行:
->setGoalName ($dictSelRow->getName())
但如果使用 findOneBy 就可以了。
存储库:
class DictSelRepository extends EntityRepository
{
/**
* Function MyQuery
* @param $selName
*
* @return array
*/
public function MyQuery( $selName )
{
return $this->createQueryBuilder( 'dg' )
->where( 'dg.name= :par1' )
->andWhere( 'dg.dateStart >= :now')
->andWhere( 'dg.dateEnd < :now')
->setParameter( 'par1', $selName )
->setParameter( 'now', new \DateTime() )
->getQuery()
->setMaxResults(1)
->getResult();
}
}
来自控制器
/**
* Creates a new SeluRF entity.
*
* @Route("/new", name="selu_new")
* @Method({"GET", "POST"})
*
*
* @Template
*/
public function newSeluRFAction( Request $request)
{
$em = $this->getDoctrine()->getRepository( 'MyBundle:SeluRF' );
$dictSelRow = $em
// ->findOneBy( [ 'name' => 'X127a',]);
->dictGoalByTypeQuery( '1w' );
$SeluRF = new SeluRF();
$SeluRF
->setGoalName ($dictSelRow->getName())
->setGoalType ($dictSelRow->getType())
->setDateStart($dictSelRow->getDateStart())
->setDateEnd ($dictSelRow->getDateEnd())
->setSymbolName($dictSelRow->getSymbolName())
;
$form = $this->createForm('MyBundle\Form\SeluType', $SeluRF);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($SeluRF);
$em->flush();
return $this->redirectToRoute('selu_show', ['id' => $SeluRF->getId()]);
}
return [
'SeluRF' => $SeluRF,
'form' => $form->createView(),
];
}
如果您不希望您的函数 return 数组而是单个实体,请使用 getSingleResult
:
class DictSelRepository extends EntityRepository
{
/**
* Function MyQuery
* @param $selName
*
* @return array
*/
public function MyQuery( $selName )
{
return $this->createQueryBuilder( 'dg' )
->where( 'dg.name= :par1' )
->andWhere( 'dg.dateStart >= :now') // This should probably be <= ?
->andWhere( 'dg.dateEnd < :now') // This should probably be > (or >=) ?
->setParameter( 'par1', $selName )
->setParameter( 'now', new \DateTime() )
->getQuery()
->getSingleResult(); // Replaced getResult with getSingleResult
}
}
我必须在我的 Symfony3 项目中更改什么才能通过 Doctrine 正确接收数据?
当我用 ->MyQuery($selName) 替换 -> findOneBy ('name' => $selName)
时,我会收到 FatalThrowableError
:
"Call to a member function getName() on array 500 Internal Server Error" 行:
->setGoalName ($dictSelRow->getName())
但如果使用 findOneBy 就可以了。
存储库:
class DictSelRepository extends EntityRepository
{
/**
* Function MyQuery
* @param $selName
*
* @return array
*/
public function MyQuery( $selName )
{
return $this->createQueryBuilder( 'dg' )
->where( 'dg.name= :par1' )
->andWhere( 'dg.dateStart >= :now')
->andWhere( 'dg.dateEnd < :now')
->setParameter( 'par1', $selName )
->setParameter( 'now', new \DateTime() )
->getQuery()
->setMaxResults(1)
->getResult();
}
}
来自控制器
/**
* Creates a new SeluRF entity.
*
* @Route("/new", name="selu_new")
* @Method({"GET", "POST"})
*
*
* @Template
*/
public function newSeluRFAction( Request $request)
{
$em = $this->getDoctrine()->getRepository( 'MyBundle:SeluRF' );
$dictSelRow = $em
// ->findOneBy( [ 'name' => 'X127a',]);
->dictGoalByTypeQuery( '1w' );
$SeluRF = new SeluRF();
$SeluRF
->setGoalName ($dictSelRow->getName())
->setGoalType ($dictSelRow->getType())
->setDateStart($dictSelRow->getDateStart())
->setDateEnd ($dictSelRow->getDateEnd())
->setSymbolName($dictSelRow->getSymbolName())
;
$form = $this->createForm('MyBundle\Form\SeluType', $SeluRF);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($SeluRF);
$em->flush();
return $this->redirectToRoute('selu_show', ['id' => $SeluRF->getId()]);
}
return [
'SeluRF' => $SeluRF,
'form' => $form->createView(),
];
}
如果您不希望您的函数 return 数组而是单个实体,请使用 getSingleResult
:
class DictSelRepository extends EntityRepository
{
/**
* Function MyQuery
* @param $selName
*
* @return array
*/
public function MyQuery( $selName )
{
return $this->createQueryBuilder( 'dg' )
->where( 'dg.name= :par1' )
->andWhere( 'dg.dateStart >= :now') // This should probably be <= ?
->andWhere( 'dg.dateEnd < :now') // This should probably be > (or >=) ?
->setParameter( 'par1', $selName )
->setParameter( 'now', new \DateTime() )
->getQuery()
->getSingleResult(); // Replaced getResult with getSingleResult
}
}