Uploaded image for project: 'Doctrine 2 - ORM'
  1. Doctrine 2 - ORM
  2. DDC-2400

[GH-648] Add a AddParameters method in the QueryBuilder


    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Invalid
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: None
    • Security Level: All
    • Labels:


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

      Url: https://github.com/doctrine/doctrine2/pull/648



      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 :

      // ... 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` :

      // ....
      $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 :

      // ....
      $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.




          • Assignee:
            guilhermeblanco Guilherme Blanco
            doctrinebot Doctrine Bot
          • Votes:
            0 Vote for this issue
            1 Start watching this issue


            • Created: