# Override filtering behavior

{% hint style="success" %}
This is the official documentation of the `forestadmin/laravel-forestadmin` v2+ and `forestadmin/symfony-forestadmin` PHP agents.
{% endhint %}

You may want to read about the following topics before using those features:

* [Structure of a `ConditionTree`](https://docs.forestadmin.com/developer-guide-agents-php/data-sources/getting-started/queries/filters#examples)
* [List of all filtering Operators](https://docs.forestadmin.com/developer-guide-agents-php/data-sources/getting-started/queries/filters#operators)
* [Operator equivalence system](https://docs.forestadmin.com/developer-guide-agents-php/data-sources/getting-started/queries/filters#operator-equivalence)

### Disabling operators

{% hint style="info" %}
Disabling filtering can be made without any code [in the field settings](https://docs.forestadmin.com/user-guide/collections/customize-your-fields#basic-settings).
{% endhint %}

### Substitution

Operation substitution can be used for two motives:

* Performance: provide a more efficient way to perform a given filtering operation
* Capabilities: enable filtering on a computed field or other non-filterable fields

```php
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;

$forestAgent->customizeCollection(
    'Customer',
    function (CollectionCustomizer $builder) {
        $builder->replaceFieldOperator(
        	'fullName',
        	Operators::EQUAL,
        	function ($value) {
        		[$firstName, $lastName] = explode(' ', $value);

        		return [
        			'aggregation' => 'And',
        			'conditions' => [
        				['field' => 'firstName', 'operator' => Operators::EQUAL, 'value' => $firstName],
        				['field' => 'lastName', 'operator' => Operators::EQUAL, 'value' => $lastName],
        			],
        		];
        	}
        );
    }
);
```

### Operators to support to enable the search

| Column Type | Operator to support            |
| ----------- | ------------------------------ |
| Number      | Equal                          |
| Enum        | Equal                          |
| String      | IContains OR Contains OR Equal |
| Uuid        | Equal                          |

You can use the [replaceFieldOperator](#substitution) method to unlock the operators.

### Emulation

Filtering emulation allows making fields filterable automatically. It is a convenient way to get things working quickly for Collections that have a low number of records (in the thousands at most).

{% hint style="warning" %}
This emulation forces the Agent to retrieve all the Collection records and compute the field values for each one of them. As a consequence, filtering emulation performance cost is **linear** with the number of records in the Collection, so **activate it sparingly and with great care**.
{% endhint %}

```php
use ForestAdmin\AgentPHP\DatasourceCustomizer\CollectionCustomizer;
use ForestAdmin\AgentPHP\DatasourceToolkit\Components\Query\ConditionTree\Operators;

$forestAgent->customizeCollection(
    'Customer',
    function (CollectionCustomizer $builder) {
        // Add support for all operators
    	$builder->emulateFieldFiltering('fullName');

    	// Add support for a single operator
    	$builder->emulateFieldOperator('fullName', Operators::EQUAL);
    }
);
```
