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

Symfony 为什么findOneBy返回null而不是结果?,symfony,doctrine-orm,doctrine,query-builder,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"=>$pe

我在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和对象

编辑

这是我的最后期限:


    /**
     * @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;
grilly.php:

    /**
     * @ORM\OneToMany(targetEntity="TernaireGrilleHebergementPeriode", mappedBy="grille")
     */
    private $TernaireGrilleHebergementPeriode;
编辑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();
    }
这应该可以做到,而且查询生成器返回数组而不是单个对象。如果我是正确的,您可以得到这样的单个结果

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;
    }
}

以防万一,通过ID获取TernaireGrilleHebPeriode,转储它并确保所有3个关系对象都设置正确,并且确实是传递给where方法的对象

它返回一个空数组:它们是关系映射的还是ternairegrillehbperiode由type=“integer”列组成?它们是关系映射的,我编辑了我的第一篇文章,如果你想看代码的话,我想getter和setter对于你的私有字段也是存在的?是的,setter和getter是用doctrine:generate:entities生成的,所以它们非常通用。好的,我将模拟你的问题并编辑我的回答谢谢,我希望你能够重现它。
<?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;
    }