netgen/query-translator
Laravel package that translates request input into structured query criteria for filtering, sorting, pagination, and includes. Build safe, reusable query pipelines for Eloquent with configurable mappings and operators, keeping controllers thin and consistent across endpoints.
Installation
composer require netgen/query-translator
Register the service provider in config/app.php under providers:
Netgen\QueryTranslator\QueryTranslatorServiceProvider::class,
Basic Usage Import the translator and parse a query string:
use Netgen\QueryTranslator\QueryTranslator;
$translator = app(QueryTranslator::class);
$ast = $translator->parse('title:laravel AND (tags:php OR tags:framework)');
First Use Case: Search Query Parsing Use the AST (Abstract Syntax Tree) to build a structured query for Elasticsearch, SQL, or custom logic:
$query = $translator->parse('price > 100 AND stock > 0');
$sql = $query->toSql(); // Hypothetical method (see implementation patterns)
Parse Complex Queries The package converts human-readable search queries into an AST for programmatic manipulation:
$ast = $translator->parse('(name:john OR name:doe) AND age > 30');
$ast->getChildren(); // Traverse nodes
Custom Node Processing Extend functionality by adding custom node types or modifiers:
$ast->addModifier('boost', 2.0); // Example: Boost relevance
Elasticsearch Example Convert AST to Elasticsearch DSL:
$query = $translator->parse('title:laravel AND tags:php');
$elasticsearchQuery = $query->toElasticsearchQuery();
SQL Generation (Hypothetical) If extending for SQL, map AST nodes to WHERE clauses:
$sql = "WHERE (title LIKE '%laravel%' AND tags LIKE '%php%')";
$query = $translator->parse(request('q'));
if ($query->hasModifier('boost')) {
$query->adjustBoost();
}
$results = $searchService->search($query->toElasticsearchQuery());
if (!$translator->isValid('invalid:query')) {
abort(400, 'Invalid query syntax');
}
$cacheKey = md5($queryString);
$ast = cache()->remember($cacheKey, now()->addHours(1), fn() => $translator->parse($queryString));
Unsupported Operators
AND, OR, NOT). Custom operators (e.g., >, <) may require extension.Netgen\QueryTranslator\Parser\TokenStream or use QueryTranslator::setCustomOperators().Performance with Complex Queries
((a AND b) OR (c AND d))) can bloat the AST.QueryTranslator::setMaxDepth() to enforce limits.Case Sensitivity
title:laravel) are case-sensitive by default.$queryString = strtolower($queryString);
Deprecated Methods
dd($ast->toArray()); // Visualize the parsed tree
$translator->setDebug(true); // Logs parsing steps
Custom Node Types
Add support for domain-specific syntax (e.g., range:10..20):
$translator->addNodeType('range', RangeNode::class);
Post-Processing Hooks Modify the AST after parsing:
$ast->on('postParse', function ($ast) {
$ast->rewriteFieldNames(fn($name) => strtolower($name));
});
Integration with Laravel Scout Override Scout’s query builder to use the translator:
public function toScoutQuery()
{
$ast = app(QueryTranslator::class)->parse($this->query);
return $ast->toScoutQuery();
}
field:value syntax. For single-field queries (e.g., laravel), configure a default field:
$translator->setDefaultField('title');
AND → &&):
$translator->setLocale('de_DE');
How can I help you explore Laravel packages today?