以随机顺序和限制从数据库中返回随机数据

时间:2021-03-30 11:01:22

标签: symfony

我是 symfony 的新手,我正在尝试以随机顺序查看其中一个表中的数据,限制为 4。我尝试在存储库中执行此操作,但 RAND() 不起作用,所以我'我在控制器中尝试。

错误如下:

“警告:array_rand() 期望参数 1 是数组,给定的对象”

我不明白为什么,在 $response 中我将数据设置为数组。

这是我的实际代码:

/**
* @Route("/ws/random/superviviente", name="ws_random_survi")
*/
    public function randomSurvi(Request $request): Response
    {
        $data = $request->request->all();
        $entityManager = $this->getDoctrine()->getManager();

        $randomPerks = $entityManager->getRepository(Perks::class)
            ->getRandomPerks();
        
        $response = new JsonResponse();
        $response -> setStatusCode(200);
        $response -> setData(array('random perk' => $randomPerks));

        $resultRandom = array_rand($response);

        return $resultRandom;
        
    }

2 个答案:

答案 0 :(得分:1)

您正试图在一个学说数组集合上使用 array_rand。

您可以将其转换为数组,然后再转换回学说数组:

use Doctrine\Common\Collections\ArrayCollection;
public function randomSurvi(Request $request): Response
    {
        $data = $request->request->all();
        $entityManager = $this->getDoctrine()->getManager();

        $randomPerks = $entityManager->getRepository(Perks::class)
            ->getRandomPerks();
        
        $resultRandom = new ArrayCollection(array_rand($randomPerks->toArray()));

        return new JsonResponse($resultRandom);
        
    }

否则它将与 shuffle 一起使用:

 $randomPerks = $entityManager->getRepository(Perks::class)->getRandomPerks();
 $randomPerks = shuffle($randomPerks);

或者直接通过your method in your repository获得随机福利。

参见来自 @Krzysztof Trzos 的示例:

  public function getRandomProducts($amount = 7)
    {
        return $this->getRandomProductsNativeQuery($amount)->getResult();
    }


/**
 * @param int $amount
 * @return ORM\NativeQuery
 */
public function getRandomProductsNativeQuery($amount = 7)
{
    # set entity name
    $table = $this->getClassMetadata()
        ->getTableName();

    # create rsm object
    $rsm = new ORM\Query\ResultSetMapping();
    $rsm->addEntityResult($this->getEntityName(), 'p');
    $rsm->addFieldResult('p', 'id', 'id');

    # make query
    return $this->getEntityManager()->createNativeQuery("
        SELECT p.id FROM {$table} p ORDER BY RAND() LIMIT 0, {$amount}
    ", $rsm);
}

答案 1 :(得分:0)

您可以编写自己的查询来实现此目的,因此在存储库中创建一个新方法,如下所示:

public function getRandomPerks(int $limit): array
{
    $queryBuilder = $this->createQueryBuilder('p');

    return $queryBuilder
        ->setMaxResults($limit)
        ->orderBy('RAND()')
        ->getQuery()
        ->getResult();
}

然后在您的控制器中,您要做的就是调用该方法并传递一个限制:

$randomPerks = $entityManager->getRepository(Perks::class)
    ->getRandomPerks(4);