Skip to content

Commit

Permalink
Improved query builder section
Browse files Browse the repository at this point in the history
-> Added a new section about binding params to the query
-> Added a short note on how to use $qb->expr()->in() with string values
  • Loading branch information
Shurakai committed May 12, 2010
1 parent f9b77f9 commit b857655
Showing 1 changed file with 53 additions and 1 deletion.
54 changes: 53 additions & 1 deletion manual/en/query-builder.txt
Expand Up @@ -72,6 +72,56 @@ This method is the responsable to build every piece of DQL. It takes 3 parameter
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');

++++ Binding parameters to your query

Doctrine supports dynamic binding of parameters to your query, similar to preparing queries. You can use both strings and numbers as placeholders, although both have a slightly different syntax. Binding parameters can simply be achieved as follows:

[php]
// $qb instanceof QueryBuilder

// example6: how to define: "SELECT u FROM User u WHERE u.id = ? ORDER BY u.name ASC" using QueryBuilder string support
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');
->setParameter(1, 100); // Sets ?1 to 100, and thus we will fetch a user with u.id = 100

You are not forced to enumerate your placeholders as the alternative syntax is available:


[php]
// $qb instanceof QueryBuilder

// example6: how to define: "SELECT u FROM User u WHERE u.id = ? ORDER BY u.name ASC" using QueryBuilder string support
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = :identifier')
->add('orderBy', 'u.name ASC');
->setParameter('identifier', 100); // Sets :identifier to 100, and thus we will fetch a user with u.id = 100

Note that numeric placeholders start with a ? followed by a number while the named placeholders start with a : followed by a string.

If you've got several parameters to bind to your query, you can also use setParameters() instead of setParameter() with the following syntax:

[php]
// $qb instanceof QueryBuilder

// Query here...
$qb->setParameters(array(1 => 'value for ?1', 2 => 'value for ?2', 'whatever' => 'your value for :whatever'));


Getting already bound parameters is easy - simply use the abovementioned syntax with "getParameter()" or "getParameters()":

[php]
// $qb instanceof QueryBuilder

// See example above
$params = qb->getParameters(array(1, 2, 'whatever'));
// Equivalent to
$param = array($qb->getParameter(1), $qb->getParameter(2), $qb->getParameter('whatever'));

Note: If you try to get a parameter that was not bound yet, getParameter() simply returns NULL.

++++ Expr\* classes

When you call `add()` with string, it internally evaluates to an instance of `Doctrine\ORM\Query\Expr\Expr\*` class.
Expand Down Expand Up @@ -197,6 +247,8 @@ Here it is a complete list of supported helper methods available:
public function not($restriction); // Returns Expr\Func instance

// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance

// Example - $qb->expr()->notIn('u.id', '2')
Expand Down Expand Up @@ -353,4 +405,4 @@ Here is a complete list of helper methods in `QueryBuilder`:

// Example - $qb->addOrderBy('u.firstName')
public function addOrderBy($sort, $order = null); // Default $order = 'ASC'
}
}

0 comments on commit b857655

Please sign in to comment.