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