PHPackages                             monkeyscloud/monkeyslegion-query - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. monkeyscloud/monkeyslegion-query

ActiveLibrary[Database &amp; ORM](/categories/database)

monkeyscloud/monkeyslegion-query
================================

Performance-first Query Builder &amp; Micro-ORM for MonkeysLegion v2

2.0.5(2w ago)12.6k↓13.7%6MITPHPPHP ^8.4CI passing

Since Jul 23Pushed 2w agoCompare

[ Source](https://github.com/MonkeysCloud/MonkeysLegion-Query)[ Packagist](https://packagist.org/packages/monkeyscloud/monkeyslegion-query)[ RSS](/packages/monkeyscloud-monkeyslegion-query/feed)WikiDiscussions main Synced 3d ago

READMEChangelog (2)Dependencies (24)Versions (43)Used By (6)

MonkeysLegion Query — v2
========================

[](#monkeyslegion-query--v2)

[![PHP](https://camo.githubusercontent.com/bfb98d885e37493cddcc01059ebf02a8872de9da37c12691b8bb6d13fcdca735/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e342532422d626c75652e737667)](https://php.net)[![License](https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667)](LICENSE)![Tests](https://camo.githubusercontent.com/388a406f72b784db5f02b8374bf7e2423c23285dfd77897f7cc23da4c54e10c6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54657374732d313536253230706173732d627269676874677265656e2e737667)

Performance-first Query Builder &amp; Micro-ORM for the [MonkeysLegion](https://github.com/MonkeysCloud) framework.

Architecture
------------

[](#architecture)

```
QueryBuilder (Fluent API)
  → typed Clause VOs (zero string work)
    → QueryCompiler (stateless, cached)
      → GrammarInterface (MySQL/MariaDB, PostgreSQL, SQLite)
        → ConnectionManagerInterface (read/write routing)

EntityRepository (single class)
  → IdentityMap (same row → same object)
    → UnitOfWork (batched writes)
      → EntityHydrator (cached reflection)

```

Key Features
------------

[](#key-features)

FeatureDescription**Performance-first**Structural SQL caching (xxh128), statement reuse, zero-copy bindings**4 DB engines**MySQL, MariaDB, PostgreSQL, SQLite — full grammar implementations**Read/write routing**Automatic: SELECTs → `read()`, DML → `write()` via `ConnectionManagerInterface`**PHP 8.4**Property hooks, asymmetric visibility, readonly classes, backed enums**Identity map**Same row always returns same object instance**Unit of Work**`persist()` / `remove()` / `flush()` — batched writes in one transaction**Cursor pagination**Constant-memory traversal of large datasets**CTE builder**Standard and recursive CTEs across all 4 engines**Vector search**pgvector, MySQL 9.x VEC\_DISTANCE, with fallbacks**\#\[Scope\] attribute**Global and per-query scopes on repository methodsInstallation
------------

[](#installation)

```
composer require monkeyscloud/monkeyslegion-query:2.x-dev
```

Quick Start
-----------

[](#quick-start)

### Query Builder

[](#query-builder)

```
use MonkeysLegion\Query\Query\QueryBuilder;

// Inject ConnectionManagerInterface via DI
$qb = new QueryBuilder($connectionManager);

// SELECT
$users = $qb->from('users')
    ->select(['id', 'name', 'email'])
    ->where('status', '=', 'active')
    ->where('age', '>', 18)
    ->orderByDesc('created_at')
    ->limit(25)
    ->get();

// First row
$user = $qb->from('users')
    ->where('email', '=', 'alice@example.com')
    ->first();

// Aggregates
$count = $qb->from('orders')->where('status', '=', 'pending')->count();
$total = $qb->from('orders')->sum('amount');

// INSERT
$id = $qb->from('users')->insert([
    'name'  => 'Alice',
    'email' => 'alice@example.com',
]);

// UPDATE
$qb->from('users')
    ->where('id', '=', $id)
    ->update(['status' => 'verified']);

// DELETE
$qb->from('sessions')
    ->where('expired_at', '
