[DDC-2400] [GH-648] Add a AddParameters method in the QueryBuilder Created: 13/Apr/13  Updated: 14/Apr/13  Resolved: 14/Apr/13

Status: Resolved
Project: Doctrine 2 - ORM
Component/s: None
Affects Version/s: None
Fix Version/s: None
Security Level: All

Type: Bug Priority: Major
Reporter: Doctrine Bot Assignee: Guilherme Blanco
Resolution: Invalid Votes: 0
Labels: None


 Description   

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

Url: https://github.com/doctrine/doctrine2/pull/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
<?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
<?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
<?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.



 Comments   
Comment by Doctrine Bot [ 14/Apr/13 ]

A related Github Pull-Request [GH-648] was closed:
https://github.com/doctrine/doctrine2/pull/648

Generated at Tue Jul 29 04:51:30 UTC 2014 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.