Symfony 4 - заполнить массив пользователями типа ROLE_FITTER - PullRequest
0 голосов
/ 17 января 2019

Приложение Symfony 4 с использованием FOSUserBundle.

Попытка перечислить пользователей с определенной ролью (ROLE_FITTER) в раскрывающемся меню с помощью jquery / ajax.

Я пытаюсь добавить в мой APIController действие, которое получит список пользователей с ролью ROLE_FITTER и вернет JSON-массив с ними в нем - так что затем можно будет заполнить выпадающий список этими пользователями.

Я пытался собрать несколько разных примеров, но не уверен, как правильно построить запрос:

namespace App\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;


class APIController extends AbstractController
{

    /**
     * Returns a JSON string of the Fitters with their id.
     *
     * @Route(/profile/booking/new/fitters)
     * @param Request $request
     * @return JsonResponse
     */
    public function listFitters(Request $request)
    {
        // Get Entity manager and repository
        $em= $this->getDoctrine()->getManager();
        $qb = $em->createQueryBuilder();

        $qb->select('u')
            ->from('userBundle:User', 'u')
            ->where('u.id = :user')
            ->andWhere('u.roles LIKE :roles')
            ->setParameter('user', $id)
            ->setParameter('roles', '%"' . $role . '"%');

        $user = $qb->getQuery()->getResult();

        // Serialize into an array the data that we need, in this case only name and id
        $responseArray = array();
        foreach ($users as $user) {
            $responseArray[] = array(
                "id" => $user->getId(),
                "name" => $user->getName()
            );
        }

        // Return array for dropdown

        return new JsonResponse($responseArray);
    }
}

Как мне заполнить этот массив пользователями типа ROLE_FITTER?

1 Ответ

0 голосов
/ 17 января 2019

Хорошо использовать сериализованные строки в SQL никогда не является хорошей идеей, не знаю, почему такой популярный пакет будет делать это, но это то, что есть.

Ваш запрос в письменном виде проверяет пользователя с определенным идентификатором и ролью. но вы никогда не предоставляете идентификатор или роль !. Я не думаю, что вы хотите сделать запрос по id, поэтому правильный запрос должен выглядеть примерно так:

public function listFitters(Request $request)
{
    // Get Entity manager and repository
    $em= $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();

    //set required role
    $role = 'ROLE_FITTER';

    $qb->select('u')
        ->from('userBundle:User', 'u')
        ->where('u.roles LIKE :roles')
        ->setParameter('roles', '%"' . $role . '"%');

    $user = $qb->getQuery()->getResult();

    // Serialize into an array the data that we need, in this case only name and id
    $responseArray = array();
    foreach ($users as $user) {
        $responseArray[] = array(
            "id" => $user->getId(),
            "name" => $user->getName()
        );
    }

    // Return array for dropdown

    return new JsonResponse($responseArray);
}

Вероятно, вам следует выбрать только те поля, которые вы хотите (id, name), и избегать цикла построения массива, но я не особенно знаком с symfony / doctrine, поэтому не уверен в правильном синтаксисе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...