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:
$players = Player::get()->filter('FirstName', 'Sam'); // Default DB engine behaviour
$players = Player::get()->filter('FirstName:case', 'Sam'); // case-sensitive
$players = Player::get()->filter('FirstName:nocase', 'Sam'); // NOT case-sensitive
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'
]);