在 WHERE 中使用 oneToMany 查询 DQL
Query DQL using oneToMany in WHERE
此查询无效:
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();
}
服务class中的映射是这样的:
/**
* @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 的错误信息是:
"Type of association must be one of *_TO_ONE or MANY_TO_MANY"
并且 Php 控制台中的错误是:
PHP Notice: Undefined index: precificacoes in D:\Projetos\FinanceiroEscolarApi\vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php on line 946
你能帮帮我吗?
我能够找出问题所在。是Service和Precification之间的One-To-Many双向映射。
Servico class 映射
/**
* @OneToMany(targetEntity="Precificacao", mappedBy="servico", cascade={"persist"})
* @var Collection
*/
private $precificacoes;
Precificacao class 映射
/**
* @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();
}
此查询无效:
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();
}
服务class中的映射是这样的:
/**
* @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 的错误信息是:
"Type of association must be one of *_TO_ONE or MANY_TO_MANY"
并且 Php 控制台中的错误是:
PHP Notice: Undefined index: precificacoes in D:\Projetos\FinanceiroEscolarApi\vendor\doctrine\orm\lib\Doctrine\ORM\Query\SqlWalker.php on line 946
你能帮帮我吗?
我能够找出问题所在。是Service和Precification之间的One-To-Many双向映射。
Servico class 映射
/**
* @OneToMany(targetEntity="Precificacao", mappedBy="servico", cascade={"persist"})
* @var Collection
*/
private $precificacoes;
Precificacao class 映射
/**
* @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();
}