Почему findOneBy возвращает ноль вместо результата? - PullRequest
1 голос
/ 15 января 2020

Я работаю на 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();
    }

Как это возможно? Я сбросил и, кажется, я использую правильные идентификаторы и объекты.

РЕДАКТИРОВАТЬ

Вот мой 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;

Решетка радиатора. php:

    /**
     * @ORM\OneToMany(targetEntity="TernaireGrilleHebergementPeriode", mappedBy="grille")
     */
    private $TernaireGrilleHebergementPeriode;

РЕДАКТИРОВАТЬ 2

Я нашел решение, я просто перевернул 2 параметра, когда я позвонил менеджеру. Спасибо @ B0re за помощь.

1 Ответ

1 голос
/ 15 января 2020

Потому что вам нужно передавать объекты построителю запросов, а не идентификаторам. 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.

...