Search code examples
doctrine-query

doctrine query with parameters having multiple values


I want to make a doctrine query in which each parameters can have multiple values (coming from a select multiple).

I have a table with a 'type' parameter that can have value of 1, 2, 3 or 4 and an 'online' parameter that can be 0 or 1.

My query so far is the following :

$query = $this->createQueryBuilder('properties');

if (array_key_exists('type', $searchValues)) {

    $types = $searchValues['type'];
    $iterator = 0;

    foreach ($types as $type) {

        if ($iterator == 0) {

            $query->andWhere('properties.idPropertyType = ' . $type);

        } else {

            $query->orWhere('properties.onlineProperties = ' . $type);

        }

            $iterator++;

        }
    }

if (array_key_exists('status', $searchValues)) {

    $status = $searchValues['status'];
    $iterator = 0;

    foreach ($status as $statu) {

        if ($iterator == 0) {

            $query->andwhere('properties.onlineProperties = ' . $statu);

        } else {

            $query->andWhere('properties.onlineProperties = ' . $statu);

        }

        $iterator++;

    }

}

$properties = $query->getQuery()->getResult();

In the case of a search with parameter type = 1 and online = 0 and 1, I have results where type is another value than 1. I understand the reason why but I cannot figure out a proper way to make my query.


Solution

  • You don't need to build your query by hand manually, just use the (in) function from the QueryBuilder class. Try this:

    $query = $this->createQueryBuilder('properties');
    
    if(array_key_exists('type', $searchValues)){
        $types = $searchValues['type'];
        $query->andWhere($query->expr()->in('properties.idPropertyType', $types));
    }
    
    if(array_key_exists('status', $searchValues)){
        $status = $searchValues['status'];
        $query->andwhere($query->expr()->in('properties.onlineProperties', $status));
    }
    
    $properties = $query->getQuery()->getResult();