exclude operations specify exact matches by default. However, when filtering
DataLists, 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.
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
":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
Note that all search filters (e.g.
:PartialMatch) refer to services registered with Injector
DataListFilter. prefixed namespace. New filters can be registered using the below yml
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' ]);