Symfony使用MIN功能的最低用户出价?

时间:2016-01-05 04:21:26

标签: php mysql sql symfony doctrine-orm

我想获得每个产品ID的最低出价。

return $this->getEntityManager()
        ->createQuery('
            SELECT PARTIAL b.{Id, MIN(amount) as amount, currency}, PARTIAL p.{id, firstName, lastName}
            FROM  AppBundle:Bid b
            LEFT JOIN b.provider p
            WHERE b.product in (:product)
            AND b.status = :status
            GROUP BY b.product
            ORDER BY b.amount'
        )
        ->setParameter('product', $ids)
        ->setParameter('status', 'active')
        ->getResult()
    ;

我收到以下错误

  

[语法错误]第0行,第42栏:错误:预期   Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_CURLY_BRACE,得到'('

我在SQL中运行完全相似的查询,它工作正常,但我不确定如何在doctrine查询构建器中实现相同。

2 个答案:

答案 0 :(得分:1)

如果你想用doctrine查询用户mysql函数你必须添加doctrine mysql函数的扩展名,或者你可以用户本机查询。我在后面添加了原生查询:

use Doctrine\ORM\Query\ResultSetMapping;


$rsm = new ResultSetMapping();
$rsm->addEntityResult('AppBundle:Bid', 'b');
$rsm->addFieldResult('b', 'Id', 'Id');
$rsm->addFieldResult('b', 'amount', 'amount');
$rsm->addFieldResult('b', 'currency', 'currency');
...
$sqlQuery = "SELECT b.Id, MIN(b.amount), b.currency, p.firstName, p.lastName
        FROM  AppBundle:Bid b
        LEFT JOIN b.AppBundle:Provider p
        WHERE b.AppBundle:Product in (:product)
        AND b.status = :status
        GROUP BY b.product
        ORDER BY b.amount";
$query = $em->createNativeQuery($sqlQuery, $rsm)
     ->setParameter('product', $ids)
     ->setParameter('status', 'active');
$query->getResult();

如果有任何问题,请告诉我

答案 1 :(得分:1)

在DQL查询中使用PARTIAL关键字时,您只能列出所选实体的属性(MIN()函数不是您实体的属性)。您可以简单地省略PARTIAL部分并使用这样的查询(请注意,Doctrine不会返回结果集中的对象,只返回平面数组,另请参阅http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#partial-object-syntax):

SELECT b.Id, MIN(b.amount) as amount, b.currency as bid, p.id, p.firstName, p.lastName as provider
FROM  AppBundle:Bid b
LEFT JOIN b.provider p
WHERE b.product in (:product) AND b.status = :status
GROUP BY b.product
ORDER BY b.amount