Skip to content

Loading…

DDC-2400: [GH-648] Add a AddParameters method in the QueryBuilder #3113

Closed
doctrinebot opened this Issue · 6 comments

2 participants

@doctrinebot

Jira issue originally created by user @doctrinebot:

This issue is created automatically through a Github pull request on behalf of Taluu:

Url: #648

Message:

Hi,

On doctrine 2.2, when we were calling the method setParameters to set a bunch of parameters on the QueryBuilder, each parameters were added or modified if they were already existing.

That is not the case since doctrine 2.3 : each calls to setParameters will wipe out the other already setted parameters. I think it is logic, but still is a huge BC break, which is not really mentionned in the UPGRADE file (only the once regarding the use of an ArrayCollection is mentionned).

With this PR, I added a addParameters which allows to add several parameters in several calls. Here is a use case :

<?php
// ... A repository
class UserRepository extends EntityRepository
{
     public function getUserWithSomething($criteriaA, $criteriaB, DateTime $since = null)
     {
         $qb = $this->createQueryBuilder('u');
         $qb->where($qb->expr()->andX($qb->expr()->eq('u.criteriaA', ':criteriaA'),
                                                       $qb->expr()->eq('u.criteriaB', ':criteriaB')));

         // wanna search for objects since a specific date
         if (null !== $since) {
             $qb = $this->addSince($qb, $since);
         }

         $qb->addParameters(new ArrayCollection(['criteriaA' => $criteriaA, 
                                                                       'criteriaB' => $criteriaB]));

         return $qb->getQuery()->execute();
     }

     public function addSince(QueryBuilder $qb, DateTime $since)
     {
         $qb = $qb->andWhere($qb->expr()->gte('u.date', ':since'));

         return $qb->setParameter('since', $since);
     }
}

So, as I was saying, until 2.2, you could use setParameters in the main method (getUserWithSomething) which was calling (or not) the submethod addSince, which could set parameters before calling the setParameters method. Now, you can't do that anymore : either you need to make several calls to setParameter :

<?php
// ....
     $qb = $qb->setParameter('criteriaA', $criteriaA)
                   ->setParameter('criteraB', $criteriaB);
//...

Either, I guess, you need to first retrieve all the parameters and then add them by hand :

<?php
// ....
     $parameters = $qb->getParameters();
     $parameters->add(new Parameter('criteriaA', $criteriaA);
     $parameters->add(new Parameter('criteriaB', $criteriaB);

     $qb = $qb->setParameters($parameters);
//...

So that's why I propose this new method in the QueryBuilder. if I'm wrong anywhere, or need more information please feel free to comment. :)

Cheers.

@doctrinebot

Comment created by @doctrinebot:

A related Github Pull-Request [GH-648] was closed:
#648

@doctrinebot

Issue was closed with resolution "Invalid"

@doctrinebot

Comment created by @doctrinebot:

A related Github Pull-Request [GH-648] was assigned:
doctrine/dbal#648

@doctrinebot

Comment created by @doctrinebot:

A related Github Pull-Request [GH-648] was unassigned:
doctrine/dbal#648

@doctrinebot

Comment created by @doctrinebot:

A related Github Pull-Request [GH-648] was closed:
doctrine/dbal#648

@doctrinebot

Comment created by @doctrinebot:

A related Github Pull-Request [GH-648] was assigned:
doctrine/dbal#648

@doctrinebot doctrinebot closed this
@doctrinebot doctrinebot added the Bug label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.