Symfony doctrine DQL随机导致Query with MaxResult

时间:2017-02-17 11:34:33

标签: php mysql symfony doctrine-orm

如何使用dql Query获取随机结果?

这是我的疑问:

$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 ...但是由于性能的原因,这不是一个好的解决方案。

1 个答案:

答案 0 :(得分:3)

您需要为此创建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();