Reputation: 357
I work on Symfony 3.4
When I run the following command, I have a result :
SELECT * FROM ternaire_grille_hebergement_periode WHERE grille_id = x AND hebergement_id = y AND periode_id = z;
and it's correct.
But when I use
findOneBy(array("hebergement"=>$hebergement, "grille"=>$grille, "periode"=>$periode))
it returns null
.
And this repository method returns an empty array :
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();
}
How is it possible ? I dumped and it seems I use correct ids and objects.
EDIT
Here is my 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;
EDIT 2
I found the solution, I juste inversed 2 parameters when I called the manager. Thanks to @B0re for his help.
Upvotes: 2
Views: 1104
Reputation: 239
Because you need to pass objects to query builder, not ids. 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();
}
This should do the trick, also query builder returns array not a single object if I'm correct, you can get single result like this
if($queryResult && count($queryResult)) {
$singleObject = $queryResult[0]
}
Edit
when I recreated the issue everything worked, make sure the objects are indeed set properly, below is my test code
EntityA, EntityB, EntityC follow the below schema
<?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 entity
<?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;
}
}
Test function
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;
}
Just in case fetch your TernaireGrilleHebPeriode by ID, dump it and make sure all 3 relation objects are set correct and are indeed the objects you pass to the where methods.
Upvotes: 1