Symfony 学说 DQL 随机结果在使用 MaxResult 的查询中

Posted

技术标签:

【中文标题】Symfony 学说 DQL 随机结果在使用 MaxResult 的查询中【英文标题】:Symfony doctrine DQL random result in Query with MaxResult 【发布时间】:2017-02-17 11:34:32 【问题描述】:

如何使用 dql 查询获得随机结果?

这是我的查询:

$firstCategoryId = 50;

$repository = $this->entityManager->getRepository(BaseProduct::class);

        $products = $repository->createQueryBuilder('p')
            ->join('p.categories', 'c')
            ->where('c.id = :categoryId')
            ->setParameter('categoryId', $firstCategoryId)
            ->getQuery()
            ->setMaxResults(4)
            ->getResult();

这总是返回给我前 4 个产品。 假设 ID 为 50 的类别有 100 多种产品。我想要的是从 ID 为 50 的类别中随机查询 4 ​​篇文章。但是如何?这可能吗?当然,我可以不设置 Max Result 而不是使用 php 来设置...但是由于性能问题,这不是一个好的解决方案。

【问题讨论】:

如果不是很在意速度,可以尝试获取所有产品,打乱结果数组,然后获取前4个元素。 看here,这已经回答了 How to select randomly with doctrine的可能重复 【参考方案1】:

您需要为此创建 dql 函数。 https://gist.github.com/Ocramius/919465你可以检查一下。

namespace Acme\Bundle\DQL;

use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;

class RandFunction extends FunctionNode

    public function parse(Parser $parser)
    
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    

    public function getSql(SqlWalker $sqlWalker)
    
        return 'RAND()';
    

然后打开您的 config.yml 文件并添加自动加载 RandFunction。

orm:
        dql:
            numeric_functions:
                Rand: Acme\Bundle\DQL\RandFunction

您的查询必须是这样的:

$firstCategoryId = 50;

$repository = $this->entityManager->getRepository(BaseProduct::class);

        $products = $repository->createQueryBuilder('p')
            ->join('p.categories', 'c')
            ->addSelect('RAND() as HIDDEN rand')
            ->where('c.id = :categoryId')
            ->orderBy('rand')
            ->setParameter('categoryId', $firstCategoryId)
            ->getQuery()
            ->setMaxResults(4)
            ->getResult();

【讨论】:

以上是关于Symfony 学说 DQL 随机结果在使用 MaxResult 的查询中的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine DQL (Symfony2) - WHERE 连接字段是 IN params

使用连接表返回结果的学说不起作用 Symfony2

使用 symfony2 缓存 ReadOnly 学说 2 实体的结果

Symfony - 在学说查询构建器中使用 orWhere()

学说2 dql,在进行类似比较时使用带有%通配符的setParameter

与学说 dql 连接的子查询