Pular para o conteúdo principal

Filtering Results

You can filter the results of a query using the IteratorFilter class. This class simplifies creating filters for use with an Iterator. It is a standard feature across all AnyDataset implementations.

Basic Usage

<?php
// Create the IteratorFilter instance
$filter = new IteratorFilter();
$filter->and('field', Relation::EQUAL, 10);

// Create the Dataset
$dataset = new AnyDataset($file);

// get the iterator
$iterator = $dataset->getIterator($filter);

// This will return an iterator with only the rows where the field is equal to 10
informação

The IteratorFilter class is a standard feature across all AnyDataset implementations, making it easy to filter data from any source (databases, XML, JSON, arrays, etc.) using the same interface.

Available Relations

The IteratorFilter class supports the following relations from the Relation enum:

RelationDescription
Relation::EQUALField equals the value
Relation::NOT_EQUALField does not equal the value
Relation::GREATER_THANField is greater than the value
Relation::LESS_THANField is less than the value
Relation::GREATER_OR_EQUAL_THANField is greater than or equal to the value
Relation::LESS_OR_EQUAL_THANField is less than or equal to the value
Relation::CONTAINSField contains the value (substring match)
Relation::STARTS_WITHField starts with the value
Relation::INField value is in the provided array
Relation::NOT_INField value is not in the provided array
Relation::IS_NULLField value is null
Relation::IS_NOT_NULLField value is not null

Filter Methods

The IteratorFilter class provides the following methods:

MethodDescription
and(string $name, Relation $relation, mixed $value = null)Adds an AND condition to the filter
or(string $name, Relation $relation, mixed $value)Adds an OR condition to the filter
startGroup(string $name, Relation $relation, mixed $value)Starts a group of conditions with the first condition
endGroup()Ends a group of conditions
match(array $array)Applies the filter to an array of rows and returns matching rows
format(IteratorFilterFormatter $formatter, ?string $tableName, array &$params, string $returnFields)Formats the filter for use with a specific formatter (e.g., SQL)
addRelation(string $name, Relation $relation, mixed $value)Alias for and() (deprecated)
addRelationOr(string $name, Relation $relation, mixed $value)Alias for or() (deprecated)

Complex Conditions with AND / OR

For more complex queries, you can use the and, or, startGroup, and endGroup methods to combine conditions.

Example: Simple AND/OR Conditions

<?php
$filter = new IteratorFilter();
$filter->and('field1', Relation::EQUAL, 10);
$filter->and('field2', Relation::GREATER_THAN, 20);
$filter->or('field3', Relation::CONTAINS, 'test');

// This will match rows where:
// (field1 = 10 AND field2 > 20) OR field3 contains 'test'

Example: Grouped Conditions

If we want to filter the rows where the field is equal to 10 or 2, and the field2 is equal to 20:

(field = 10 OR field = 2) AND field2 = 20

We can do this:

<?php
$filter = new IteratorFilter();
$filter->startGroup('field', Relation::EQUAL, 10);
$filter->or('field', Relation::EQUAL, 2);
$filter->endGroup();
$filter->and('field2', Relation::EQUAL, 20);

$iterator = $dataset->getIterator($filter);

Example: NULL Checking

To filter for rows where a field is null or not null:

<?php
$filter = new IteratorFilter();
// Find rows where email is null
$filter->and('email', Relation::IS_NULL);

// Or find rows where email is not null
$filter->and('email', Relation::IS_NOT_NULL);

Using with Different Formatters

The IteratorFilter can be used with different formatters to generate XPath or other query formats:

<?php
// Create a filter
$filter = new IteratorFilter();
$filter->and('name', Relation::CONTAINS, 'John');
$filter->and('age', Relation::GREATER_THAN, 30);

// Format for XPath (useful when working with XML datasets)
$params = [];
$xpath = $filter->format(new IteratorFilterXPathFormatter(), null, $params);
// Result: "/anydataset/row[contains(field[@name='name'], 'John') and field[@name='age'] > '30']"

// The base IteratorFilterFormatter can be used for custom formatting
$formatted = $filter->format(new IteratorFilterFormatter(), null, $params);
// Result: "str_contains(%name, 'John') and %age > 30"

Static Factory Method

You can also use the static factory method to create a new instance:

<?php
$filter = IteratorFilter::getInstance()
->and('field1', Relation::EQUAL, 10)
->and('field2', Relation::GREATER_THAN, 20);