为什么findOneBy返回null而不是结果?

时间:2020-01-15 08:33:02

标签: symfony doctrine-orm doctrine query-builder

我正在研究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的帮助。

1 个答案:

答案 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方法的对象。