为什么 findOneBy returns null 而不是结果?
Why findOneBy returns null instead of a result?
我在 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))
它returns null
.
而这个存储库方法 returns 一个空数组:
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
我找到了解决方案,我在给经理打电话时只反转了 2 个参数。感谢@B0re 的帮助。
因为您需要将对象而不是 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();
}
这应该可以解决问题,还有查询生成器 returns 数组不是单个对象如果我是正确的,您可以获得这样的单个结果
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 方法的对象。
我在 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))
它returns null
.
而这个存储库方法 returns 一个空数组:
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
我找到了解决方案,我在给经理打电话时只反转了 2 个参数。感谢@B0re 的帮助。
因为您需要将对象而不是 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();
}
这应该可以解决问题,还有查询生成器 returns 数组不是单个对象如果我是正确的,您可以获得这样的单个结果
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 方法的对象。