TimothyAURA
TimothyAURA

Reputation: 1359

Symfony 4 - populate array with the users of type ROLE_FITTER

Symfony 4 app using FOSUserBundle.

Trying to list users with a particular role (ROLE_FITTER) in a dropdown menu using jquery/ajax.

I'm trying to add an Action in my APIController that will get the list of users with role ROLE_FITTER and return a JSON array with them in it - so can then populate the dropdown with list of these users.

I have tried to pull together some different examples, but not sure how to correctly build the query:

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);
    }
}

How do I populate this array with the users of type ROLE_FITTER?

Upvotes: 0

Views: 68

Answers (1)

Steve
Steve

Reputation: 20469

Well using serialized strings in sql is never a good idea, no idea why such a popular bundle would do that, but it is what it is.

Your query as written checks for a user with specific id, and role. but you never provide the id or role!. I dont think you want to query by id, so the correct query should be something like this:

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);
}

Probably you should only select the fields you want (id, name) and avoid the array building loop, but i am not particularly familiar with symfony / doctrine so not sure of the correct syntax

Upvotes: 1

Related Questions