Php 用信条获得随机结果

Php 用信条获得随机结果,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我对条令一无所知,很难决定如何在不创建自定义DQL函数或使用本机查询的情况下获取其中的随机行。 我提出的解决方案如下,它位于实体的自定义存储库中。我希望得到一些建设性的批评,但它目前正在发挥作用 class MyRepository extends EntityRepository { /** * @param int $numberOfResults * @return array */ public function getRandomResults($numberOfResults

我对条令一无所知,很难决定如何在不创建自定义DQL函数或使用本机查询的情况下获取其中的随机行。 我提出的解决方案如下,它位于实体的自定义存储库中。我希望得到一些建设性的批评,但它目前正在发挥作用

class MyRepository extends EntityRepository
{

/**
 * @param int $numberOfResults
 * @return array
 */
public function getRandomResults($numberOfResults = 1)
{
    $maxID = $this->getMax();
    $count = 0;
    $randomNumberCounter = 0;
    $randomNumbers = array();
    while ($randomNumberCounter < $numberOfResults) {
        $randomNumberCounter++;
        $randomNumbers[] = $this->getRandom(0, $maxID);
    }

    $qb = $this->createQueryBuilder('r');
    while ($count < $numberOfResults) {
        $qb
            ->andWhere(
                $qb->expr()->orX(
                    // the greater than is to account for holes within the primary key
                    $qb->expr()->gte("r.id", "?".$count),
                    /* the less than is in case we have a beginning database with a large disparity
                    between starting and ending ID */
                    $qb->expr()->lte("r.id", "?".$count)
                )
            );
        $count++;
    }
    $result = $qb
        ->setParameters($randomNumbers)
        ->setMaxResults($numberOfResults)
        // ensure we have no duplicates
        ->groupBy('r.id')
        ->getQuery();

    return $result->getResult();
}


/**
 * get the maximum ID that the table has
 * @return mixed
 * TODO: Create a Cron job to set this every 6 hours
 */
public function getMax()
{
    $maxID = $this->createQueryBuilder('r')
        ->select('(MAX(r.id))')
        ->getQuery()
        ->getSingleScalarResult();
    return $maxID;
}

/**
 * @param $min
 * @param $max
 * @return int
 */
public function getRandom($min, $max)
{
    return mt_rand($min, $max);
}
}
类MyRepository扩展了EntityRepository
{
/**
*@param int$numberOfResults
*@return数组
*/
公共函数getRandomResults($numberOfResults=1)
{
$maxID=$this->getMax();
$count=0;
$randomNumberCounter=0;
$randomNumbers=array();
而($randomNumberCounter<$numberOfResults){
$randomNumberCounter++;
$randomNumbers[]=$this->getRandom(0,$maxID);
}
$qb=$this->createQueryBuilder('r');
而($count<$numberOfResults){
$qb
->在哪里(
$qb->expr()->orX(
//大于表示主键内的孔
$qb->expr()->gte(“r.id”、“?”$count),
/*如果我们有一个差异很大的初始数据库,则小于
在起始ID和结束ID之间*/
$qb->expr()->lte(“r.id”,“?”$count)
)
);
$count++;
}
$result=$qb
->setParameters($randomNumbers)
->setMaxResults($numberOfResults)
//确保我们没有重复
->groupBy('r.id')
->getQuery();
返回$result->getResult();
}
/**
*获取表的最大ID
*@返回混合
*TODO:创建一个Cron作业以每6小时设置一次
*/
公共函数getMax()
{
$maxID=$this->createQueryBuilder('r')
->选择('(最大(r.id))')
->getQuery()
->getSingleScalarResult();
返回$maxID;
}
/**
*@param$min
*@param$max
*@return int
*/
公共函数getRandom($min,$max)
{
返回mt_兰特($min,$max);
}
}

我想你需要它。谢谢你,我没有意识到codereview的存在是我的错!