Where
The where()
method allows you specify condition clauses. It accepts a field, an operator and a value. However, just like the select method, the API you are working with may not support operators at all. If so, then you might have to settle using where()
as a regular key-value construct.
Arguments
where()
accepts the following arguments:
$field
:string|array
name of field or key-value pair, where key = field name, value = mixed.$operator
:mixed
operator or value$value
:mixed
(optional) value. If omitted, then$operator
acts as value.
$response = $client
->where('name', 'john')
->get('/users');
default
/users?name=john
json api
/users?filter[name]=john
odata
/users?$filter=name eq 'john'
Operator
When passing an operator to the where()
method, each grammar will attempt to add it to the final query string. There is no limitation of the types of operators you can use, provided the operator is stated as string. Consider the following example.
$response = $client
->where('year', 'gt', 2020)
->get('/users');
default
/users?year[gt]=2020
json api
/users?filter[year][gt]=2020
odata
/users?$filter=year gt 2020
Multiple Conditions
You may add as many conditions as you require. The following illustrates multiple conditions on the same field.
$response = $client
->where('year', 'gt', 2020)
->where('year', 'lt', 2051)
->get('/users');
default
/users?year[gt]=2020&year[lt]=2051
json api
/users?filter[year][gt]=2020&filter[year][lt]=2051
odata
/users?$filter=year gt 2020 and year lt 2051
Via Array
If you pass an array as the first argument, then the query builder will interpret it as a list of conditions. Each key acts as the name of the field (or filter name), whereas the value acts as operator / value.
$response = $client
->where([
'year' => [
'gt' => 2021,
'lt' => 2031
],
'name' => 'john'
])
->get('/users');
default
/users?year[gt]=2021&year[lt]=2031&name=john
json api
/users?filter[year][gt]=2021&filter[year][lt]=2031&filter[name]=john
odata
/users?$filter=year gt 2021 and year lt 2031 and name eq 'john'
Array Values
When dealing with array values, you should be aware of how your chosen grammar produces it's final query string. Consider a situation the API you are working allows you to perform "where users in list" filtering. You might construct your condition in the following way.
$response = $client
->where('users', 'in', [1, 2, 3, 4])
->get('/users');
The above shown example will produce the following query string. Depending on your needs, this outcome might not be favourable for you.
default
/users?users[in][0]=1&users[in][1]=2&users[in][2]=3&users[in][3]=4
json api
/users?filter[users][in][0]=1&filter[users][in][1]=2&filter[users][in][2]=3&filter[users][in][3]=4
odata
/users?$filter=users in (1,2,3,4)
Alternatively, you could convert array values in to a comma-separated list. If so, then you could create your condition in the following way:
$response = $client
->where('users', 'in', implode(',', [1, 2, 3, 4]))
->get('/users');
default
/users?users[in]=1,2,3,4
json api
/users?filter[users][in]=1,2,3,4
odata
Caution: The above shown example will not create a valid OData "where users in ..." query. Consider using a regular array as value or make use of the whereRaw()
method instead.
/users?$filter=users in `1,2,3,4`
Where Raw
The whereRaw()
method can be used for stating conditions as raw expressions. Alternatively, you may also use the raw method instead.
Two arguments are supported by the whereRaw()
method:
$expression
:string
the raw expression$bindings
:array
(optional) binding values
$response = $client
->whereRaw('filter=user eq :amount', [ 'amount' => 10 ])
->get('/users');
default
/users?filter=user eq 10
json api
Caution: Resulting query string is not a valid Json API filter!
/users?filter=user eq 10
odata
Caution: Resulting query string is not a valid OData filter!
/users?$filter=filter=user eq 10
Or Where
orWhere()
and orWhereRaw()
can be used to add "or" conjunctions in your http query string. However, apart from OData, these are NOT considered conventional. Chances are pretty good that these are NOT supported by API you are working with, if "or" conjunctions are supported at all.
$response = $client
->where('name', 'john')
->orWhere('gender', 'male')
->get('/users');
default
Caution: Not conventional!
The ampersand + pipe symbols (&|
) are used as a prefix, for each field/filter that acts as an "or" conjunction. This symbol can be changed in the grammar's configuration, in config/http-clients.php
.
/users?name=john&|gender=male
json api
Caution: Not conventional!
The pipe symbol (|
) is used as a prefix, for each field/filter that acts as an "or" conjunction. This symbol can be changed in the grammar's configuration, in config/http-clients.php
.
/users?filter[name]=john&filter[|gender]=male
odata
/users?$filter=name eq 'john' or gender eq 'male'
If your target API does support "or" conjunctions, yet these grammars fail to deliver the desired syntax for such, please consider creating a custom grammar.