How to select randomly with doctrine

前端 未结 13 956
耶瑟儿~
耶瑟儿~ 2020-11-27 20:21

Here is how I query my database for some words

$query = $qb->select(\'w\')
    ->from(\'DbEntities\\Entity\\Word\', \'w\')
    ->where(\'w.indiction         


        
相关标签:
13条回答
  • 2020-11-27 20:52

    Shuffling can be done on the query (array) result, but shuffling does not pick randomly.

    In order to pick randomly from an entity I prefer to do this in PHP, which might slow the random picking, but it allows me to keep control of testing what I am doing and makes eventual debugging easier.

    The example below puts all IDs from the entity into an array, which I can then use to "random-treat" in php.

    public function getRandomArt($nbSlotsOnPage)
    {
        $qbList=$this->createQueryBuilder('a');
    
        // get all the relevant id's from the entity
        $qbList ->select('a.id')
                ->where('a.publicate=true')
                ;       
        // $list is not a simple list of values, but an nested associative array
        $list=$qbList->getQuery()->getScalarResult();       
    
        // get rid of the nested array from ScalarResult
        $rawlist=array();
        foreach ($list as $keyword=>$value)
            {
                // entity id's have to figure as keyword as array_rand() will pick only keywords - not values
                $id=$value['id'];
                $rawlist[$id]=null;
            }
    
        $total=min($nbSlotsOnPage,count($rawlist));
        // pick only a few (i.e.$total)
        $keylist=array_rand($rawlist,$total);
    
        $qb=$this->createQueryBuilder('aw');
        foreach ($keylist as $keyword=>$value)
            {
                $qb ->setParameter('keyword'.$keyword,$value)
                    ->orWhere('aw.id = :keyword'.$keyword)
                ;
            }
    
        $result=$qb->getQuery()->getResult();
    
        // if mixing the results is also required (could also be done by orderby rand();
        shuffle($result);
    
        return $result;
    }
    
    0 讨论(0)
提交回复
热议问题