学说的 createQuery 中的子查询
Subquery in doctrine's createQuery
我遇到了一个小问题,希望有人能帮助我。
在 SQL 中,我有这个查询,它给出了我想要的结果:
SELECT * FROM price_material AS y
JOIN (
SELECT * FROM price_material_price GROUP BY id DESC
) AS x
GROUP BY y.price_material_id
现在我尝试将其转化为我的 PHP 项目:
public function getPriceLines($pricelist = 0, $year = 0, $week = 0)
{
if ($year === 0) {
$year = (int)date('Y');
}
if ($week === 0) {
$week = (int)date('W');
}
$query = $this->getEntityManager()->createQuery('
SELECT pgp FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterialPrice pgp
INNER JOIN (SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)
WHERE pr.pricelist = :pricelist AND pgp.year <= :year
AND pgp.week <= :week
GROUP BY pgp.pricelistmaterial
ORDER BY pgp.year DESC, pgp.week DESC, pgp.id DESC
')->setParameters(array('pricelist' => $pricelist, 'week' => $week, 'year' => $year));
$result = $query->getResult();
return $result;
}
但是正如我所想的那样,连接中的子查询是不可能的,因为这给了我错误:
[Semantical Error] line 0, col 119 near '"(SELECT * FROM': Error: Class '"' is not defined.
有人能指出我正确的方向吗?
您的子查询附近有一个不需要的双引号:
INNER JOIN "(SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)"
而不是
INNER JOIN (SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)"
您在 WHERE
子句中使用了 pr.prijslijst
但您从未定义它。我不懂语言(荷兰语?),但如果 prijslijst
是 PricelistMaterial
的 属性,那么像这样修改子查询应该可行:
SELECT pr FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial pr ORDER BY pr.id DESC
此外,您的参数键是错误的 - 它们在查询中似乎是用荷兰语写的,但在 setParameter
方法中是英文的。
我通过一些不同的思考找到了解决方案。
这最终是函数:
public function getPriceLines($pricelinematerial = 0, $year = 0, $week = 0)
{
if ($year === 0) {
$year = (int)date('Y');
}
if ($week === 0) {
$week = (int)date('W');
}
$query = $this->getEntityManager()->createQuery('
SELECT pgp FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterialPrice pgp
WHERE pgp.pricelistmaterial = :pricelistmaterial AND pgp.year <= :year
AND pgp.week <= :week
ORDER BY pgp.year DESC, pgp.week DESC, pgp.id DESC
')->setParameters(array('pricelistmaterial' => $pricelistmaterial, 'week' => $week, 'year' => $year));
$query->setMaxResults(1);
try {
$result = $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
$result = null;
}
return $result;
}
我遇到了一个小问题,希望有人能帮助我。 在 SQL 中,我有这个查询,它给出了我想要的结果:
SELECT * FROM price_material AS y
JOIN (
SELECT * FROM price_material_price GROUP BY id DESC
) AS x
GROUP BY y.price_material_id
现在我尝试将其转化为我的 PHP 项目:
public function getPriceLines($pricelist = 0, $year = 0, $week = 0)
{
if ($year === 0) {
$year = (int)date('Y');
}
if ($week === 0) {
$week = (int)date('W');
}
$query = $this->getEntityManager()->createQuery('
SELECT pgp FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterialPrice pgp
INNER JOIN (SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)
WHERE pr.pricelist = :pricelist AND pgp.year <= :year
AND pgp.week <= :week
GROUP BY pgp.pricelistmaterial
ORDER BY pgp.year DESC, pgp.week DESC, pgp.id DESC
')->setParameters(array('pricelist' => $pricelist, 'week' => $week, 'year' => $year));
$result = $query->getResult();
return $result;
}
但是正如我所想的那样,连接中的子查询是不可能的,因为这给了我错误:
[Semantical Error] line 0, col 119 near '"(SELECT * FROM': Error: Class '"' is not defined.
有人能指出我正确的方向吗?
您的子查询附近有一个不需要的双引号:
INNER JOIN "(SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)"
而不是
INNER JOIN (SELECT * FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial ORDER BY id DESC)"
您在 WHERE
子句中使用了 pr.prijslijst
但您从未定义它。我不懂语言(荷兰语?),但如果 prijslijst
是 PricelistMaterial
的 属性,那么像这样修改子查询应该可行:
SELECT pr FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterial pr ORDER BY pr.id DESC
此外,您的参数键是错误的 - 它们在查询中似乎是用荷兰语写的,但在 setParameter
方法中是英文的。
我通过一些不同的思考找到了解决方案。
这最终是函数:
public function getPriceLines($pricelinematerial = 0, $year = 0, $week = 0)
{
if ($year === 0) {
$year = (int)date('Y');
}
if ($week === 0) {
$week = (int)date('W');
}
$query = $this->getEntityManager()->createQuery('
SELECT pgp FROM ACME\Bundle\PricelistBundle\Entity\PricelistMaterialPrice pgp
WHERE pgp.pricelistmaterial = :pricelistmaterial AND pgp.year <= :year
AND pgp.week <= :week
ORDER BY pgp.year DESC, pgp.week DESC, pgp.id DESC
')->setParameters(array('pricelistmaterial' => $pricelistmaterial, 'week' => $week, 'year' => $year));
$query->setMaxResults(1);
try {
$result = $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
$result = null;
}
return $result;
}