Запросите DQL, используя oneToMany в WHERE - PullRequest
1 голос
/ 30 июня 2019

Этот запрос не работает:

public function getByUnidadeAnoSemestre(int $unidadeId, int $ano, int $semestre) : array
{
    $query = $this->em->createQuery(
        'SELECT s,u,p FROM ' . 
            Servico::class . ' s ' .
        'INNER JOIN ' . 
            's.unidade u ' . 
        'INNER JOIN ' . 
            's.precificacoes p ' .
        'WHERE ' . 
            'u.id = :unidadeId ' . 
            'AND p.anoLetivo = :ano ' . 
            'AND p.semestre = :semestre'
    )->setParameters([
        "unidadeId" => $unidadeId,
        "anoLetivo" => $ano,
        "semestre" => $semestre
    ]);

    return $query->getResult();

}

Отображения в классе Service выглядят так:

/**
* @OneToMany(targetEntity="Precificacao", mappedBy="precificacoes", cascade={"persist"})
* @var Collection 
*/
private $precificacoes;

/**
* @ManyToOne(targetEntity="Unidade", inversedBy="id", cascade={"persist"})
* @JoinColumn(name="unidadeId", referencedColumnName="id")
* @var Unidade 
*/
private $unidade;

Сообщение об ошибке Slim:

«Тип ассоциации должен быть одним из * _TO_ONE или MANY_TO_MANY»

И ошибка в консоли Php:

Примечание PHP: Неопределенный индекс: precificacoesв D: \ Projetos \ FinanceiroEscolarApi \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ Query \ SqlWalker.php в строке 946

Можете ли вы мне помочь?

1 Ответ

0 голосов
/ 02 июля 2019

Мне удалось выяснить проблему. Это было двунаправленное отображение «один ко многим» между обслуживанием и уточнением.

Классификация Servico

/**
* @OneToMany(targetEntity="Precificacao", mappedBy="servico", cascade={"persist"})
* @var Collection 
*/
private $precificacoes;

Отображение класса Precificacao

/**
 * @ManyToOne(targetEntity="Servico", inversedBy="precificacoes", cascade={"persist"})
 * @JoinColumn(name="servicoId", referencedColumnName="id")
 * @var Servico
 */
private $precificacoes;

Затем я исправил запрос

public function getByUnidadeAnoSemestre(int $unidadeId, int $ano, int $semestre) : array
{
    $query = $this->em->createQuery(
        'SELECT s,u,p FROM ' . 
            Servico::class . ' s ' .
        'INNER JOIN ' . 
            's.unidade u ' . 
        'INNER JOIN ' . 
            's.precificacoes p ' .
        'WHERE ' . 
            'u.id = :unidadeId ' . 
        'AND p.anoLetivo = :ano ' . 
            'AND p.semestre = :semestre'
        )->setParameters([
            "unidadeId" => $unidadeId,
            "ano" => $ano,
            "semestre" => $semestre
        ]);

    return $query->getResult();
}
...