使用Doctrine获取随机记录

JCM*_*JCM 10 php random dql doctrine-orm

我想知道如何从一个集团中随机抽取一些成员,但我不知道最好的方法是什么,我认为ORDER BY RAND()不是最好的选择,因为一个集团可以有超过100,000个成员,执行此类型查询可能会很慢.

我发现这种方式使用SQL,但我不知道如何在DQL中做同样的事情:我如何优化MySQL的ORDER BY RAND()函数?

Jea*_*ean 12

为了不降低性能我通常做如下:

//Retrieve the EntityManager first
$em = $this->getEntityManager();

//Get the number of rows from your table
$rows = $em->createQuery('SELECT COUNT(u.id) FROM AcmeUserBundle:User u')->getSingleScalarResult();

$offset = max(0, rand(0, $rows - $amount - 1));

//Get the first $amount users starting from a random point
$query = $em->createQuery('
                SELECT DISTINCT u
                FROM AcmeUserBundle:User u')
->setMaxResults($amount)
->setFirstResult($offset);

$result = $query->getResult();  
Run Code Online (Sandbox Code Playgroud)

当然,$amount您将检索的用户对象是连续的(即第i,第(i + 1),......,(i + $amount) -),但通常需要在一个或两个实体处随机,而不是整个列表.因此,我认为这是一个有效的选择.


mar*_*pin 0

我不知道有什么方法可以从 Doctrine 中“有效”地 ORDER BY RAND() 。在您的情况下,最好的办法可能是首先获取主键,将这些键打乱,然后在 IN 语句中使用它们。

您还可以添加一个缓存层来放置第一个查询中的键(子集),特别是如果您有许多记录,以避免每次都对键重复查询。