我是 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;
}
答案 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);