--- layout: default title: The Query component redirect_from: - /5.0/components/query/ --- The Query ======= The library provides a `Query` class to ease query string creation and manipulation. This URI component object exposes the [package common API](/components/1.0/api/), but also provide specific methods to work with the URI query component.

If the modifications do not change the current object, it is returned as is, otherwise, a new modified object is returned.

When a modification fails an League\Uri\Components\Exception exception is thrown.

Since version 1.5.0:
Query::parse is deprecated and replaced by QueryParser::parse
Query::extract is deprecated and replaced by QueryParser::extract
Query::build is deprecated and replaced by QueryBuilder::build
Please refers to the Query Parsers documentation page for more informations.

## Basic usage ~~~php The optional $separator argument was added in version 1.3.0

submitted string is normalized to be RFC3986 compliant.

If the submitted value is not valid a League\Uri\Components\Exception exception is thrown.

The `League\Uri\Components\Exception` extends PHP's SPL `InvalidArgumentException`. ### Query::getSeparator and Query::withSeparator

Query::getSeparator and Query::withSeparator are available since version 1.3.0

~~~php withSeparator('|'); $newQuery->__toString(); //return foo=bar|baz=toto ~~~ ### Query::merge `Query::merge` returns a new `Query` object with its data merged. ~~~php merge('foo=jane&r=stone'); $newQuery->__toString(); //return foo=jane&baz=toto&r=stone // the 'foo' parameter was updated // the 'r' parameter was added ~~~

Values equal to null or the empty string are merge differently.

~~~php 'bar', 'baz' => 'toto']); $newQuery = $query->merge('baz=&r'); $newQuery->__toString(); //return foo=bar&baz=&r // the 'r' parameter was added without any value // the 'baz' parameter was updated to an empty string and its = sign remains ~~~ ### Query::append `Query::append` returns a new `Query` object with its data append to it. ~~~php append('foo=baz'); $newQuery->__toString(); //return foo=jane&foo=baz&john=doe // a new foo parameter is added ~~~ ### Query::ksort `Query::ksort` returns a `Query` object with its pairs sorted according to its keys or a user defined function. The single argument `sort` can be: One of PHP's sorting constant used by the [sort function](http://php.net/sort). **In this case the query parameters are sorted from low to high** like PHP's [ksort function](http://php.net/ksort) ~~~php ksort(SORT_STRING); $newQuery->__toString(); //return baz=toto&foo=bar ~~~ A user-defined comparison function which must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second, like PHP's [uksort function](http://php.net/uksort) ~~~php ksort('strcmp'); $newQuery->__toString(); //return baz=toto&foo=bar ~~~ ## Query as a PHP data transport layer ~~~php Query::createFromParams is available since version 1.3.0

This named constructor takes any iterable construct and tries to recreate a `Query` object using internally `http_build_query`. This method takes 2 arguments: - `$params` : a iterable containing properties to transform into a query string; - `$separator`: the separator to be used when creating the query string representation; ~~~php 'bar', 'filter' => ['status' => 'on', 'order' => 'desc']], '&'); echo $query->getContent(Query::NO_ENCODING); //return 'foo=bar&filter[status]=on&filter[order]=desc'; ~~~ ### Query::getParams If you already have an instantiated `Query` object you can return all the query string deserialized arguments using the `Query::getParams` method: ~~~php 'baz']; $arr = (new Query($query_string))->getParams(); // $arr = ['foo.bar' => 'bar', 'foo_bar' => baz']]; ~~~ ### Query::getParam If you are only interested in a given argument you can access it directly using the `Query::getParam` method as show below: ~~~php getParam('foo'); //return ['bar', 'y+olo'] $query->getParam('gweta', 'now'); //return 'now' ~~~ The method returns the value of a specific argument. If the argument does not exist it will return the value specified by the second argument which defaults to `null`. ### Query::withoutParams

Query::withoutParams is available since version 1.3.0

If you want to remove PHP's variable from the query string you can use the `Query::withoutParams` method as shown below ~~~php withoutParams(['foo']); $new_query->getParam('foo'); //return null echo $new_query->getContent(Query::NO_ENCODING); //return 'z=' ~~~ ### Query::withoutNumericIndices

Query::withoutNumericIndices is available since version 1.3.0

If your query string is created with `http_build_query` or the `Query::createFromParams` named constructor chances are that numeric indices have been added by the method. The `Query::withoutNumericIndices` removes any numeric index found in the query string as shown below: ~~~php getContent(Query::NO_ENCODING); //return 'foo[0]=bar&foo[1]=baz' $new_query = $query->withoutNumericIndices(); echo $new_query->getContent(Query::NO_ENCODING); //return 'foo[]=bar&foo[]=baz' //of note both objects returns the same PHP's variables but differs regarding the pairs $query->getParams(); //return ['foo' => ['bar', 'baz']] $new_query->getParams(); //return ['foo' => ['bar', 'baz']] ~~~ ## Query as a collection of key/value pairs ~~~php $separator is availiabe since version 1.3.0.

#### Examples ~~~php 'bar', 'p' => 'yolo', 'z' => '' ]); echo $query; //display 'foo=bar&p=yolo&z=' $query = Query::createFromPairs([ 'foo' => 'bar', 'p' => null, 'z' => '' ]); echo $query; //display 'foo=bar&p&z=' ~~~ ### Countable and IteratorAggregate The class implements PHP's `Countable` and `IteratorAggregate` interfaces. This means that you can count the number of pairs and use the `foreach` construct to iterate over them. ~~~php $value) { //do something meaningful here } ~~~

When looping the key and the value are decoded.

### Query::getPairs The `Query::getPairs` method returns the object's array representation. ~~~php getPairs(); // returns [ // 'foo' => 'bar', // 'p' => 'y olo', // 'z' => '', // ] ~~~

The returned array contains decoded data.

### Query::getPair If you are only interested in a given pair you can access it directly using the `Query::getPair` method as show below: ~~~php getPair('foo'); //return 'bar' $query->getPair('gweta'); //return null $query->getPair('gweta', 'now'); //return 'now' ~~~ The method returns the value of a specific pair key. If the key does not exist it will return the value specified by the second argument which defaults to `null`.

The returned data are fully decoded.

### Query::hasPair Because a pair value can be `null` the `Query::hasPair` method is used to remove the possible `Query::getPair` result ambiguity. ~~~php getPair('foo'); //return 'bar' $query->getPair('p'); //return null $query->getPair('gweta'); //return null $query->hasPair('gweta'); //return false $query->hasPair('p'); //return true ~~~ ### Query::keys If you are interested in getting the pairs keys you can do so using the `Query::keys` method. ~~~php keys(); //return ['foo', 'p', 'z']; $query->keys('bar'); //return ['foo']; $query->keys('gweta'); //return []; ~~~ By default, the method returns all the keys, but if you supply a value, only the keys whose value equals the value are returned. ### Query::withoutPairs `Query::withoutPairs` returns a new `Query` object with deleted pairs according to their keys. This method expects an array containing a list of keys to remove as its single argument. ~~~php withoutPairs(['foo', 'p']); echo $newQuery; //displays 'z=' ~~~ ### Query::withoutEmptyPairs `Query::withoutEmptyPairs` returns a new `Query` object with deleted empty pairs. A pair is considered empty if its key equals the empty string and its value is `null`. ~~~php withoutEmptyPairs(); echo $query; //displays '&&=toto&&&&=&' echo $newQuery; //displays '=toto&=' ~~~