gol*_*ife 0 php mysql symfony doctrine-orm
如何使用 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();
Run Code Online (Sandbox Code Playgroud)
这总是让我返回前 4 个产品。假设 ID 为 50 的类别有 100 多种产品。我想要的是从 ID 为 50 的类别中随机查询 4 篇文章。但是如何?这可能吗?当然,我可以不设置 Max Result 而不是用 PHP 来设置……但由于性能原因,这不是一个好的解决方案。
小智 6
您需要为此创建 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()';
}
}
Run Code Online (Sandbox Code Playgroud)
之后打开您的 config.yml 文件并添加自动加载该 RandFunction。
orm:
dql:
numeric_functions:
Rand: Acme\Bundle\DQL\RandFunction
Run Code Online (Sandbox Code Playgroud)
你的查询必须是这样的:
$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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1403 次 |
| 最近记录: |