Skip to main content
FiQueLa lets you filter, join, group, and aggregate data from structured files using familiar SQL concepts. Write queries as PHP fluent API calls or as SQL-like strings — your choice.

Installation

Install via Composer and set up optional format dependencies.

Quickstart

Write your first query against a file in under 5 minutes.

Fluent API

Build queries with a chainable PHP API — selects, filters, joins, and more.

FQL Syntax

Write SQL-like strings to query files directly using the File Query Language.

Why FiQueLa?

Work with structured files using SQL concepts you already know — no database setup required.
  • Universal format support — XML, JSON, NDJSON, CSV, XLS/XLSX, ODS, YAML, NEON, and directories
  • Two query interfaces — fluent PHP API or FQL string syntax, interchangeable
  • Stream-first — large JSON, XML, and CSV files processed with low memory overhead
  • Full SQL feature setJOIN, GROUP BY, HAVING, ORDER BY, UNION, EXPLAIN, and 40+ built-in functions
  • DTO mapping — map results directly to typed PHP objects

Explore the docs

Supported formats

See which file formats are supported and how to open them.

Query lifecycle

Understand how FiQueLa executes a query step by step.

Conditions & operators

Filter data with WHERE, AND, OR, XOR, LIKE, REGEXP, BETWEEN, and more.

Functions reference

Browse 40+ built-in string, math, date, array, and hashing functions.

Joins

Join data across multiple files and formats in a single query.

EXPLAIN & benchmarking

Inspect query execution plans and benchmark performance.

Quick example

use FQL\Query;
use FQL\Enum\Operator;

$results = Query\Provider::fromFileQuery('xml(./products.xml).SHOP.SHOPITEM')
    ->selectAll()
    ->where('PRICE', Operator::LESS_THAN_OR_EQUAL, 200)
    ->orderBy('PRICE')->desc()
    ->limit(10)
    ->execute()
    ->fetchAll();
Or using FQL string syntax:
use FQL\Query;

$results = Query\Provider::fql(<<<FQL
    SELECT *
    FROM xml(./products.xml).SHOP.SHOPITEM
    WHERE PRICE <= 200
    ORDER BY PRICE DESC
    LIMIT 10
FQL)->execute()->fetchAll();