Возвращать случайную базу данных формы данных в случайном порядке и с лимитом

Я новичок в 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;
        
    }

Что делает getRandomPerks()?

simon.ro 30.03.2021 14:13

Данные внутри $response представляют собой массив, но сам $response является объектом типа JsonResponse.

simon.ro 30.03.2021 14:14

@ simon.ro getRandomPerks получает все привилегии из таблицы

bafecas538 30.03.2021 14:16

Что вы пробовали для устранения проблемы? Запуск array_rand на чем-то, что очевидно является массивом нет, звучит странно

Nico Haase 30.03.2021 16:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
4
42
2

Ответы 2

Вы пытаетесь использовать 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».

bafecas538 30.03.2021 15:13

Мой плохой, использовал неправильную переменную, исправил ее, другая часть моего ответа должна работать, хотя

Dylan Kas 30.03.2021 16:01

Для этого вы можете написать свой собственный запрос, поэтому создайте новый метод внутри репозитория следующим образом:

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 мой собственный выбор?

bafecas538 30.03.2021 15:11

Другие вопросы по теме