Я новичок в 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;
}
Данные внутри $response представляют собой массив, но сам $response является объектом типа JsonResponse.
@ simon.ro getRandomPerks получает все привилегии из таблицы
Что вы пробовали для устранения проблемы? Запуск array_rand на чем-то, что очевидно является массивом нет, звучит странно




Вы пытаетесь использовать 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);
}
В противном случае он работал бы с перемешиванием:
$randomPerks = $entityManager->getRepository(Perks::class)->getRandomPerks();
$randomPerks = shuffle($randomPerks);
Или получите случайные льготы напрямую через ваш метод в вашем репозитории.
См. Пример из @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);
}
с первым вариантом появляется эта ошибка: Попытка вызвать неопределенный метод с именем «toArray» класса «Symfony \ Component \ HttpFoundation \ JsonResponse».
Мой плохой, использовал неправильную переменную, исправил ее, другая часть моего ответа должна работать, хотя
Для этого вы можете написать свой собственный запрос, поэтому создайте новый метод внутри репозитория следующим образом:
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);
внутри createQueryBuilder мой собственный выбор?
Что делает
getRandomPerks()?