L01C
L01C

Reputation: 753

Doctrine querybuilder how to replace parameters with an array of parameters?

I would like to replace some parameters by an array of parameters, because I don't know how many variables I will receive. The problem is that my function return some results that doesn't correspond to my origin array... And that's logic. I don't know how to do that.

I need to transform this function by an array of $filter instead of $filter, $filter2, $filter3.

public function getContentByFilterTest($categ,$filter,$filter2,$filter3){
    $query = $this->createQueryBuilder('c')
    ->join('c.filterfilter', 'f1')
    ->join('c.filterfilter', 'f2')
    ->join('c.filterfilter', 'f3')
    ->andWhere('f1.idfilter = :filter_idfilter1')
    ->andWhere('f2.idfilter = :filter_idfilter2')
    ->andWhere('f3.idfilter = :filter_idfilter3')
    ->andWhere('c.contentCategorycontentCategory = :category')
    ->setParameters(array(
            'filter_idfilter1' => $filter,
            'filter_idfilter2' => $filter2,
            'filter_idfilter3' => $filter3,
            'category' => $categ,
    ))
    ->getQuery()->getResult();
    return $query;
}

I tried this :

public function getContentByFilterTestBoucle($categ, array $filters ){
    $query = $this->createQueryBuilder('c')->select('c.name');
    for ($i = 1; $i <= count($filters); $i++){
        $query = $query->join('c.filterfilter', 'f'.$i)
        ->andWhere('f'.$i.'.idfilter = :filter_idfilter'.$i)
        ->setParameters(array(
                'filter_idfilter'.$i => $filters[$i-1],
        ))
        ;
    }
    $query->andWhere('c.contentCategorycontentCategory = :category')
    ->setParameter('category', $categ)
    ->getQuery()->getResult();
    return $query;
}

Upvotes: 2

Views: 2578

Answers (1)

Matteo
Matteo

Reputation: 39390

The setParameters replace all previously setted parameter, so you shoud use this:

    ->setParameter(
            sprintf('filter_idfilter%s',$i) , $filters[$i-1]
    )

instead of this:

    ->setParameters(array(
            'filter_idfilter'.$i => $filters[$i-1],
    ))

Hope this help

Upvotes: 3

Related Questions