我正在研究Symfony 3.4
运行以下命令时,我得到一个结果:
SELECT * FROM ternaire_grille_hebergement_periode WHERE grille_id = x AND hebergement_id = y AND periode_id = z;
是正确的。
但是当我使用
findOneBy(array("hebergement"=>$hebergement, "grille"=>$grille, "periode"=>$periode))
它返回null
。
此存储库方法返回一个空数组:
public function getTernaireByGrilleHebPeriode($grilleId, $hebergementId, $periodeId){
$qb = $this->createQueryBuilder("q")
->where("q.hebergement = :hebergement")
->andWhere("q.grille = :grille")
->andWhere("q.periode = :periode")
->setParameters(array("hebergement"=>$hebergementId, "grille"=>$grilleId, "periode"=>$periodeId));
return $qb->getQuery()->getResult();
}
怎么可能?我转储了,似乎我使用了正确的ID和对象。
编辑
这是我的TernaireGrilleHebergementPeriode:
/**
* @ORM\ManyToOne(targetEntity="Grille", inversedBy="ternaireGrilleTarifHebergementPeriode")
*/
private $grille;
/**
* @ORM\ManyToOne(targetEntity="Hebergement", inversedBy="ternaireGrilleTarifHebergementPeriode")
*/
private $hebergement;
/**
* @ORM\ManyToOne(targetEntity="Periode", inversedBy="ternaireGrilleTarifHebergementPeriode")
*/
private $periode;
Periode.php:
/**
* @ORM\OneToMany(targetEntity="TernaireGrilleHebergementPeriode", mappedBy="periode")
*/
private $TernaireGrilleHebergementPeriode;
Hebergement.php:
/**
* @ORM\OneToMany(targetEntity="TernaireGrilleHebergementPeriode", mappedBy="hebergement")
*/
private $TernaireGrilleHebergementPeriode;
Grille.php:
/**
* @ORM\OneToMany(targetEntity="TernaireGrilleHebergementPeriode", mappedBy="grille")
*/
private $TernaireGrilleHebergementPeriode;
编辑2
我找到了解决方案,当我打电话给经理时,我反了两个参数。感谢@ B0re的帮助。
答案 0 :(得分:1)
因为您需要将对象而不是ID传递给查询生成器。尝试
public function getTernaireByGrilleHebPeriode(Grille $grille, Hebergement $hebergement, Periode $periode){
$qb = $this->createQueryBuilder("q")
->where("q.hebergement = :hebergement")
->andWhere("q.grille = :grille")
->andWhere("q.periode = :periode")
->setParameters(array("hebergement"=>$hebergement, "grille"=>$grille, "periode"=>$periode));
return $qb->getQuery()->getResult();
}
这应该可以解决问题,如果我正确的话,查询生成器也将返回数组而不是单个对象,这样您就可以得到单个结果
if($queryResult && count($queryResult)) {
$singleObject = $queryResult[0]
}
编辑
,当我重新创建该问题后,一切正常,请确保这些对象确实设置正确,以下是我的测试代码
EntityA,EntityB,EntityC遵循以下架构
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="entity_a")
* @ORM\Entity(repositoryClass="App\Repository\EntityARepository")
*/
class EntityA
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
public function getId()
{
return $this->id;
}
/**
* @ORM\OneToMany(targetEntity="ABC", mappedBy="entityA")
*/
private $abcs;
public function getAbcs()
{
return $this->abcs;
}
public function setAbcs($abcs)
{
$this->abcs = $abcs;
return $this;
}
}
ABC实体
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="a_b_c")
* @ORM\Entity(repositoryClass="App\Repository\ABCRepository")
*/
class ABC
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
public function getId()
{
return $this->id;
}
/**
* @ORM\ManyToOne(targetEntity="EntityA", inversedBy="abcs")
*/
private $entityA;
public function getEntityA()
{
return $this->entityA;
}
public function setEntityA($entityA)
{
$this->entityA = $entityA;
return $this;
}
/**
* @ORM\ManyToOne(targetEntity="EntityB", inversedBy="abcs")
*/
private $entityB;
public function getEntityB()
{
return $this->entityB;
}
public function setEntityB($entityB)
{
$this->entityB = $entityB;
return $this;
}
/**
* @ORM\ManyToOne(targetEntity="EntityC", inversedBy="abcs")
*/
private $entityC;
public function getEntityC()
{
return $this->entityC;
}
public function setEntityC($entityC)
{
$this->entityC = $entityC;
return $this;
}
}
测试功能
public function test(Request $request)
{
/** @var EntityManagerInterface $em */
$em = $this->getDoctrine()->getManager();
$entityA = $em->getRepository('App\Entity\EntityA')->find(1); //new EntityA();
$entityB = $em->getRepository('App\Entity\EntityB')->find(1); //new EntityB();
$entityC = $em->getRepository('App\Entity\EntityC')->find(1); //new EntityC();
//$em->persist($entityA);
//$em->flush();
//$em->persist($entityB);
//$em->flush();
//$em->persist($entityC);
//$em->flush();
//$abc = new ABC();
//$abc
// ->setEntityA($entityA)
// ->setEntityB($entityB)
// ->setEntityC($entityC)
//;
//$em->persist($abc);
//$em->flush();
$abc = $em->createQueryBuilder()
->select('abc')
->from('App\Entity\ABC', 'abc')
->where('abc.entityA = :entityA')
->andWhere('abc.entityB = :entityB')
->andWhere('abc.entityC = :entityC')
->setParameters([
'entityA' => $entityA,
'entityB' => $entityB,
'entityC' => $entityC,
])
->getQuery()
->getResult()
;
dump($abc); // abc is array with 1 result
die;
}
以防万一通过ID提取您的TernaireGrilleHebPeriode,将其转储并确保所有3个关系对象均设置正确,并且确实是您传递给where方法的对象。