{"id":36279521,"url":"https://github.com/adambanaszkiewicz/query-builder","last_synced_at":"2026-01-11T09:02:18.646Z","repository":{"id":62534929,"uuid":"78513844","full_name":"adambanaszkiewicz/query-builder","owner":"adambanaszkiewicz","description":"Fast, simple and dependency-free query builder for PHP.","archived":false,"fork":false,"pushed_at":"2023-06-18T21:27:39.000Z","size":46,"stargazers_count":23,"open_issues_count":4,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-10T21:29:17.907Z","etag":null,"topics":["database","database-adapter","database-management","query-builder","query-building"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adambanaszkiewicz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-10T08:36:42.000Z","updated_at":"2025-02-08T10:24:03.000Z","dependencies_parsed_at":"2024-06-12T05:24:49.822Z","dependency_job_id":"8477aa29-5ed0-4634-b525-70636026016f","html_url":"https://github.com/adambanaszkiewicz/query-builder","commit_stats":null,"previous_names":["adambanaszkiewicz/query-builder","requtize/query-builder"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/adambanaszkiewicz/query-builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adambanaszkiewicz%2Fquery-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adambanaszkiewicz%2Fquery-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adambanaszkiewicz%2Fquery-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adambanaszkiewicz%2Fquery-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adambanaszkiewicz","download_url":"https://codeload.github.com/adambanaszkiewicz/query-builder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adambanaszkiewicz%2Fquery-builder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28298875,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T08:21:30.231Z","status":"ssl_error","status_checked_at":"2026-01-11T08:21:26.882Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","database-adapter","database-management","query-builder","query-building"],"created_at":"2026-01-11T09:02:18.507Z","updated_at":"2026-01-11T09:02:18.594Z","avatar_url":"https://github.com/adambanaszkiewicz.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QueryBuilder\n\nQuery Builder is a fast, simple, methods-chaining, dependency-free library to create SQL Queries simple and fast to write, extend and manage. Supports databases which are supported by PDO. Can be also used as Database Abstraction Layer.\n\n## Installation - via composer.json\n```json\n\"requtize/query-builder\": \"dev-master\"\n```\n\n### Usage whith connection estabilished before, in some other system's part.\n```php\nuse Requtize\\QueryBuilder\\Connection;\nuse Requtize\\QueryBuilder\\QueryBuilder\\QueryBuilderFactory;\nuse Requtize\\QueryBuilder\\ConnectionAdapters\\PdoBridge;\n\n// Somewhere in our application we have created PDO instance\n$pdo = new PDO('dns...');\n\n// Build Connection object with PdoBridge ad Adapter\n$conn = new Connection(new PdoBridge($pdo));\n\n// Pass this connection to Factory\n$qbf = new QueryBuilderFactory($conn);\n\n// Now we can use the factory as QueryBuilder - it creates QueryBuilder\n// object every time we use some of method from QueryBuilder and returns it.\n$result = $qbf-\u003efrom('table')-\u003ewhere('cost', '\u003e', 120)-\u003eall();\n```\n\n# Query Builder Methods\n\n### Table selection\n```php\n// Set table to operate on.\n$qbf-\u003etable('table');\n$qbf-\u003etable('table', 'next-table');\n$qbf-\u003etable('table', 'next-table', 'and-another');\n$qbf-\u003etable([ 'table', 'next-table', 'and-another' ]);\n// Alias to table() method.\n$qbf-\u003efrom(...);\n```\n\n### Selects\n```php\n// Selects\n$qbf-\u003eselect('*');\n$qbf-\u003eselect('column');\n$qbf-\u003eselect('column1', 'column2', 'column3');\n$qbf-\u003eselect([ 'column1', 'column2', 'column3' ]);\n// Select DISTINCT\n$qbf-\u003eselectDistinct('*');\n$qbf-\u003eselectDistinct('column');\n$qbf-\u003eselectDistinct('column1', 'column2', 'column3');\n$qbf-\u003eselectDistinct([ 'column1', 'column2', 'column3' ]);\n```\n### Wheres\nIf method not starts with \"or*, multiple calls will join it as \"AND\".\n```php\n$qbf-\u003ewhere('name', 'Adam')\n    -\u003ewhere('name', '=', 'Adam')\n    -\u003eorWhere('name', 'Adam')\n    -\u003eorWhere('name', '=', 'Adam')\n    -\u003ewhereNot('name', 'Adam')\n    -\u003ewhereNot('name', '=', 'Adam')\n    -\u003eorWhereNot('name', 'Adam')\n    -\u003eorWhereNot('name', '=', 'Adam')\n    -\u003ewhereIn('name' [ 'Adam', 'Eva' ])\n    -\u003ewhereNotIn('name' [ 'Adam', 'Eva' ])\n    -\u003eorWhereIn('name' [ 'Adam', 'Eva' ])\n    -\u003eorWhereNotIn('name' [ 'Adam', 'Eva' ])\n    -\u003ewhereBetween('age', 10, 20)\n    -\u003eorWhereBetween('age', 10, 20)\n    -\u003ewhereNull('sex')\n    -\u003ewhereNotNull('sex')\n    -\u003eorWhereNull('sex')\n    -\u003eorWhereNotNull('sex');\n```\nWheres (all methods above) can also take Closure as first argument. This can make sub-criterias. Sub-criterias will be joined to main query using joined from used method. As argument of the anonymous function is object NestedCriteria that allows You to use all the where() methods above.\n```php\n$qbf-\u003ewhere(function ($query) {\n    $query-\u003ewhere('id', 1)\n        -\u003ewhereNot('status', 2);\n});\n```\nWheres can also take as first argument RAW query section in two ways. First - all full criteria (column name, operator and value), or only columns/table-column value n first parameter, and value as second.\n```php\n$qbf-\u003ewhere($qbf-\u003eraw('name'), 'Adam');\n$qbf-\u003ewhere($qbf-\u003eraw('name = \"Adam\"'));\n```\n\n### Joins\n```php\n// Simple INNER JOIN\n$qbf-\u003ejoin('table', 'name', '=', 'Adam', 'inner')\n    // INNER JOIN as Closure with advanced ON criteria\n    -\u003ejoin('table', function ($join) {\n        $join-\u003eon('name', 'Adam')\n             -\u003eon('name', '=', 'Adam')\n             -\u003eorOn('name', 'Adam')\n             -\u003eorOn('name', '=', 'Adam');\n    })\n    -\u003eleftJoin('table', 'name', '=', 'Adam')\n    -\u003eleftJoin('table', function ($join) {\n        // ...\n    })\n    -\u003erightJoin('table', 'name', '=', 'Adam')\n    -\u003erightJoin('table', function ($join) {\n        // ...\n    })\n    -\u003einnerJoin('table', 'name', '=', 'Adam')\n    -\u003einnerJoin('table', function ($join) {\n        // ...\n    });\n```\n\n### Resutls set\n```php\n$qbf-\u003eall(); // Returns all results.\n$qbf-\u003efirst(); // Returns first result.\n$qbf-\u003ecount($column);\n$qbf-\u003emax($column);\n$qbf-\u003emin($column);\n$qbf-\u003esum($column);\n$qbf-\u003eavg($column);\n```\n\n### Inserts\n```php\n$qbf-\u003efrom('table')-\u003einsert([ 'name' =\u003e 'Adam' ]);\n$qbf-\u003einsert([ 'name' =\u003e 'Adam' ], 'table');\n$qbf-\u003efrom('table')-\u003einsertIgnore([ 'name' =\u003e 'Adam' ]);\n$qbf-\u003einsertIgnore([ 'name' =\u003e 'Adam' ], 'table');\n$qbf-\u003efrom('table')-\u003ereplace([ 'id' =\u003e 12, 'name' =\u003e 'Adam' ]);\n$qbf-\u003ereplace([ 'id' =\u003e 12, 'name' =\u003e 'Adam' ], 'table');\n```\n\nIf insert call operate on table with AUTO_INCREMENT column, method will return inserted ID of row. Also You can use another method (after call `insert()` method) to do the same thing:\n\n```php\n$qbf-\u003egetLastId();\n\n```\n\n### Update\n```php\n$qbf\n    -\u003efrom('table')\n    -\u003ewhere('name', 'John')\n    -\u003eupdate([ 'name' =\u003e 'Adam' ]);\n$qbf\n    -\u003ewhere('name', 'John')\n    -\u003eupdate([ 'name' =\u003e 'Adam' ], 'table');\n$qbf\n    -\u003efrom('table')\n    -\u003ewhere('name', 'John')\n    -\u003eupdateOrInsert([ 'name' =\u003e 'Adam' ]);\n$qbf\n    -\u003ewhere('name', 'John')\n    -\u003eupdateOrInsert([ 'name' =\u003e 'Adam' ], 'table');\n```\n\n### Delete\n```php\n$qbf\n    -\u003ewhere('name', 'Adam')\n    -\u003edelete('table');\n$qbf\n    -\u003efrom('table')\n    -\u003ewhere('name', 'Adam')\n    -\u003edelete();\n```\n\n### RAW values\nIn most of all methods and parameters You can pass the RAW value as argument. To do this You have to only use raw() method and pass the result of this method to any argument You want.\n```php\n$qbf-\u003ewhere($qbf-\u003eraw('name'), $qbf-\u003eraw('Adam'));\n$qbf-\u003eselect($qbf-\u003eraw('name'));\n$qbf-\u003etable($qbf-\u003eraw('table'));\n// ...and so on...\n```\n\n### Raw query\n```php\n// SELECT Query.\n$rows = $qbf-\u003equery('SELECT * FROM table WHERE name = :name', [\n    ':name' =\u003e 'Adam'\n]);\n// UPDATE, INSERT, DELETE, etc.\n$affectedCount = $qbf-\u003eexec('UPDATE table SET id = :id WHERE name = :name', [\n    ':id'   =\u003e 15,\n    ':name' =\u003e 'Adam'\n]);\n```\n\n### Sub-Queries and Nested Queries\nIn some cases You might need to create SubQuery to provide some special functionality. Use the *subQuery()* method to do this thing. Examples of usage:\n```php\n$subQuery = $qbf\n    -\u003eselect('name')\n    -\u003efrom('persons')\n    -\u003ewhere('id', 15);\n\n$query = $qbf\n    -\u003eselect('table.*')\n    -\u003efrom('table')\n    -\u003eselect($qbf-\u003esubQuery($subQuery, 'alias1'));\n\n$nestedQuery = $qbf\n    -\u003eselect('*')\n    -\u003efrom($qbf-\u003esubQuery($query, 'alias2'));\n```\nGenerated query by Query Builder.\n```sql\nSELECT *\nFROM (\n    SELECT `table`.*,\n    (\n        SELECT `name`\n        FROM `persons`\n        WHERE `id` = 15\n    ) AS alias1\n    FROM `table`\n) AS alias2\n```\n\n## Get compiled Query\nIf You want to preview a query, before execution, or for debugging intensions, You may want use *getQuery()* method, which returns *Query* object, with compiled query (with placeholders), array of bindings and the *PDO* instance. This object contains all data of current *Query Builder* instance.\n```php\n$qbf-\u003egetQuery($type = 'select', array $parameters = []);\n```\n\n## #API\n```php\n// Returns passed PDO object.\n$qbf-\u003egetPdo();\n\n// Returns all Query Segments created in this instance of Query Builder\n$qbf-\u003egetQuerySegments();\n\n// Or only selected segment\n$qbf-\u003egetQuerySegment('where');\n\n// Sets and gets EventDispatcher\n$qbf-\u003egetEventDispatcher();\n$qbf-\u003esetEventDispatcher(Requtize\\QueryBuilder\\Event\\EventDispatcherInterface $eventDispatcher);\n\n// Sets FetchMode for PDO. IF PDOs Fetch Mode requires many arguments, just pass this to this method as next arguments.\n$qbf-\u003esetFetchMode($mode...);\n// Sets Fetch mode to Object.\n$qbf-\u003easObject($className, $classConstructorArgs = []);\n\n// Gets and sets DB connection object.\n$qbf-\u003esetConnection(Requtize\\QueryBuilder\\Connection $connection);\n$qbf-\u003egetConnection();\n\n// Gets Db schema\n$qbf-\u003egetSchema();\n\n// Create new QueryBuilder instance.\n$qbf-\u003enewQuery(Requtize\\QueryBuilder\\Connection $connection = null);\n\n// Forks query. Copies all Query Segments, settings to new object and returns new object. Allows to create new Query, but with earlier defined criterias.\n$qbf-\u003eforkQuery();\n```\n# @todo\n\n- Where LIKE\n\n```PHP\n$qb-\u003elike('column', 'value');\n// WHERE column LIKE '%value%'\n$qb-\u003elike('column', 'value', 'left|start');\n// WHERE column LIKE '%value'\n$qb-\u003elike('column', 'value', 'right|end');\n// WHERE column LIKE 'value%'\n```\n\n\n\n- Scopes - reusable predefined groups of statements.\n```php\n$scopes = new ScopesContainer;\n$scopes-\u003eregister('scope-name', function($qb, $arg1, $arg2) {\n    if($arg1)\n        $qb-\u003ewhere('add_date', '\u003c', 'NOW()');\n    if($arg2)\n        $qb-\u003ewhere('add_date', '\u003e=', 'NOW()');\n});\n\n$qbf-\u003esetScopes($scopes);\n\n// ...\n\n$qbf-\u003efrom('table')-\u003escopeName('arg1', 'arg2')-\u003eall();\n```\n\n- Chunks of returned rows\nMust work only when there's no defined LIMIT statement!\n```php\n$qb-\u003ewhere('column', 1)-\u003echunk(30, function (array $chunk) {\n    foreach($chunk as $row)\n    {\n        // Do something with $row...\n    }\n});\n```\n\n- Inserting data as aggregated collection\n\n```php\n$qb-\u003einsert([\n    [ 'id' =\u003e 1, 'col' =\u003e 'val' ],\n    [ 'id' =\u003e 1, 'col' =\u003e 'val' ],\n    [ 'id' =\u003e 1, 'col' =\u003e 'val' ],\n    [ 'id' =\u003e 1, 'col' =\u003e 'val' ]\n], true, 'table');\n```\n\n- Fulltext search\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadambanaszkiewicz%2Fquery-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadambanaszkiewicz%2Fquery-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadambanaszkiewicz%2Fquery-builder/lists"}