Потому что вам нужно передавать объекты построителю запросов, а не идентификаторам. try
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, Entity C, следуйте приведенной ниже схеме
<?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;
}
}
AB C сущность
<?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;
}
На всякий случай извлеките свой TernaireGrilleHebPeriode по идентификатору, сбросьте его и убедитесь, что все 3 объекта отношения установлены правильно и действительно объекты, которые вы передаете методам where.