SearchFilter
modifiers
The filter
and exclude
operations specify exact matches by default. However, when filtering DataList
s, there are a number of suffixes that
you can put on field names to change this behavior. These are represented as SearchFilter
subclasses and include.
ExactMatchFilter
StartsWithFilter
EndsWithFilter
PartialMatchFilter
GreaterThanFilter
GreaterThanOrEqualFilter
LessThanFilter
LessThanOrEqualFilter
An example of a SearchFilter
in use:
// fetch any player that starts with a S
$players = Player::get()->filter([
'FirstName:StartsWith' => 'S',
'PlayerNumber:GreaterThan' => '10',
]);
// to fetch any player that's name contains the letter 'z'
$players = Player::get()->filterAny([
'FirstName:PartialMatch' => 'z',
'LastName:PartialMatch' => 'z',
]);
Developers can define their own SearchFilter if needing to extend the ORM filter and exclude behaviors.
These suffixes can also take modifiers themselves. The modifiers currently supported are ":not"
, ":nocase"
and
":case"
. These negate the filter, make it case-insensitive and make it case-sensitive, respectively. The default
comparison uses the database's default. For MySQL and MSSQL, this is case-insensitive. For PostgreSQL, this is
case-sensitive.
// Fetch players that their FirstName is 'Sam'
// Caution: This might be case in-sensitive if MySQL or MSSQL is used
$players = Player::get()->filter([
'FirstName:ExactMatch' => 'Sam',
]);
// Fetch players that their FirstName is 'Sam' (force case-sensitive)
$players = Player::get()->filter([
'FirstName:ExactMatch:case' => 'Sam',
]);
// Fetch players that their FirstName is 'Sam' (force NOT case-sensitive)
$players = Player::get()->filter([
'FirstName:ExactMatch:nocase' => 'Sam',
]);
By default the :ExactMatch
filter is applied, hence why we can shorthand the above to:
// Default DB engine behaviour
$players = Player::get()->filter('FirstName', 'Sam');
// case-sensitive
$players = Player::get()->filter('FirstName:case', 'Sam');
// NOT case-sensitive
$players = Player::get()->filter('FirstName:nocase', 'Sam');
Note that all search filters (e.g. :PartialMatch
) refer to services registered with Injector
within the DataListFilter.
prefixed namespace. New filters can be registered using the below yml
config:
SilverStripe\Core\Injector\Injector:
DataListFilter.CustomMatch:
class: MyVendor\Search\CustomMatchFilter
The following is a query which will return everyone whose first name starts with "S", either lowercase or uppercase:
$players = Player::get()->filter([
'FirstName:StartsWith:nocase' => 'S',
]);
// use :not to perform a converse operation to filter anything but a 'W'
$players = Player::get()->filter([
'FirstName:StartsWith:not' => 'W',
]);