为什么 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 方法的对象。