{"id":15024987,"url":"https://github.com/nilportugues/php-sql-query-builder","last_synced_at":"2025-05-14T11:08:48.262Z","repository":{"id":50590923,"uuid":"21231816","full_name":"nilportugues/php-sql-query-builder","owner":"nilportugues","description":"An elegant lightweight and efficient SQL Query Builder with fluid interface SQL syntax supporting bindings and complicated query generation.","archived":false,"fork":false,"pushed_at":"2025-01-03T22:47:13.000Z","size":428,"stargazers_count":421,"open_issues_count":45,"forks_count":115,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-04-13T08:58:35.344Z","etag":null,"topics":["builder","crud","database","mysql","mysqli","pdo","php","php7","sql","sql-query-builder"],"latest_commit_sha":null,"homepage":"http://nilportugues.com","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/nilportugues.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","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":"2014-06-26T07:23:39.000Z","updated_at":"2025-03-10T12:12:20.000Z","dependencies_parsed_at":"2024-09-28T19:40:37.569Z","dependency_job_id":"f87d2f47-49a0-440e-b41c-58359671ca13","html_url":"https://github.com/nilportugues/php-sql-query-builder","commit_stats":{"total_commits":184,"total_committers":15,"mean_commits":"12.266666666666667","dds":"0.24456521739130432","last_synced_commit":"cc3401099328ddfad54b2b801e38e05a50da11bd"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilportugues%2Fphp-sql-query-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilportugues%2Fphp-sql-query-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilportugues%2Fphp-sql-query-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nilportugues%2Fphp-sql-query-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nilportugues","download_url":"https://codeload.github.com/nilportugues/php-sql-query-builder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254129481,"owners_count":22019628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["builder","crud","database","mysql","mysqli","pdo","php","php7","sql","sql-query-builder"],"created_at":"2024-09-24T20:01:19.013Z","updated_at":"2025-05-14T11:08:48.238Z","avatar_url":"https://github.com/nilportugues.png","language":"PHP","readme":"SQL Query Builder\n=================\n\n[![Build Status](https://travis-ci.org/nilportugues/php-sql-query-builder.svg)](https://travis-ci.org/nilportugues/php-sql-query-builder) [![Coverage Status](https://img.shields.io/coveralls/nilportugues/sql-query-builder.svg)](https://coveralls.io/r/nilportugues/sql-query-builder) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nilportugues/sql-query-builder/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nilportugues/sql-query-builder/?branch=master) [![Latest Stable Version](https://poser.pugx.org/nilportugues/sql-query-builder/v/stable)](https://packagist.org/packages/nilportugues/sql-query-builder) [![Total Downloads](https://poser.pugx.org/nilportugues/sql-query-builder/downloads)](https://packagist.org/packages/nilportugues/sql-query-builder) [![License](https://poser.pugx.org/nilportugues/sql-query-builder/license)](https://packagist.org/packages/nilportugues/sql-query-builder)\n[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://paypal.me/nilportugues)\n\nAn elegant lightweight and efficient SQL Query Builder with fluid interface SQL syntax supporting bindings and complicated query generation. **Works without establishing a connection to the database.** \n\n\u003ca name=\"index_block\"\u003e\u003c/a\u003e\n\n* [1. Installation](#block1)\n* [2. The Builder](#block2)\n    * [2.1. Generic Builder](#block2.1)     \n    * [2.2. MySQL Builder](#block2.2)     \n    * [2.3. Human Readable Output](#block2.3)     \n* [3. Building Queries](#block3)\n    * [3.1. SELECT Statement](#block3.1)     \n        * [3.1.1. Basic SELECT statement](#block3.1.1) \n        * [3.1.2. Aliased SELECT statement](#block3.1.2)\n        * [3.1.3. SELECT with WHERE statement](#block3.1.3)\n        * [3.1.4. Complex WHERE conditions](#block3.1.4)\n        * [3.1.5. JOIN \u0026 LEFT/RIGHT/INNER/CROSS JOIN SELECT statements](#block3.1.5)\n        * [3.1.6. COUNT rows](#block3.1.6)\n    * [3.2. INSERT Statement](#block3.2)\n           * [3.2.1. Basic INSERT statement](#block3.2.1) \n    * [3.3. UPDATE Statement](#block3.3)\n        * [3.3.1. Basic UPDATE statement](#block3.3.1)\n        * [3.3.2. Elaborated UPDATE statement](#block3.3.2)\n    * [3.4. DELETE Statement](#block3.4)     \n        * [3.4.1. Empty table with DELETE statement](#block3.4.1)\n        * [3.4.2. Basic DELETE statement](#block3.4.2)\n        * [3.4.3. Elaborated DELETE statement](#block3.4.3)     \n    * [3.5. INTERSECT Statement](#block3.5)\n    * [3.6. MINUS Statement](#block3.6)\n    * [3.7. UNION Statement](#block3.7)\n    * [3.8. UNION ALL Statement](#block3.8)\n* [4. Advanced Quering](#block4)    \n    * [4.1. Filtering using WHERE](#block4.1)\n        * [4.1.1. Changing WHERE logical operator](#block4.2)     \n        * [4.1.2. Writing complicated WHERE conditions](#block4.2)\n    * [4.3. Grouping with GROUP BY and HAVING](#block4.3)     \n        * [4.3.1 Available HAVING operators](#block4.3.1)     \n    * [4.4. Changing HAVING logical operator](#block4.4)     \n    * [4.5. Columns as SELECT statements](#block4.5)        \n    * [4.6. Columns being Values](#block4.6)\n    * [4.7. Columns using FUNCTIONS](#block4.7)\n* [5. Commenting queries](#block5)\n* [6. Quality Code](#block6)\n* [7. Author](#block7)\n* [8. License](#block8)\n\n\n\u003ca name=\"block1\"\u003e\u003c/a\u003e\n## 1. Installation [↑](#index_block)\nThe recommended way to install the SQL Query Builder is through [Composer](http://getcomposer.org). Run the following command to install it:\n\n```sh\nphp composer.phar require nilportugues/sql-query-builder\n```\n\n\u003ca name=\"block2\"\u003e\u003c/a\u003e\n## 2. The Builder [↑](#index_block)\n\nThe SQL Query Builder allows to generate complex SQL queries standard using the `SQL-2003` dialect (default) and the `MySQL` dialect, that extends the `SQL-2003` dialect.\n\n\u003cimg src=\"./diagram.svg\" /\u003e\n\n\u003ca name=\"block2.1\"\u003e\u003c/a\u003e\n### 2.1. Generic Builder [↑](#index_block)\nThe Generic Query Builder is the default builder for this class and writes standard SQL-2003.\n\n**All column aliases are escaped using the `'` sign by default.**\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()-\u003esetTable('user');    \n\necho $builder-\u003ewrite($query);    \n```\n#### Output:\n```sql\nSELECT user.* FROM user\n```\n\n\u003ca name=\"block2.2\"\u003e\u003c/a\u003e\n### 2.2. MySQL Builder [↑](#index_block) \nThe MySQL Query Builder has its own class, that inherits from the SQL-2003 builder. All columns will be wrapped with the tilde **`** sign.\n\n**All table and column aliases are escaped using the tilde sign by default.**\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\MySqlBuilder;\n\n$builder = new MySqlBuilder(); \n\n$query = $builder-\u003eselect()-\u003esetTable('user'); \n\necho $builder-\u003ewrite($query);    \n```\n#### Output:\n```sql\nSELECT user.* FROM `user` \n```\n\n\u003ca name=\"block2.3\"\u003e\u003c/a\u003e\n#### 2.3. Human Readable Output [↑](#index_block)\n\nBoth Generic and MySQL Query Builder can write complex SQL queries. \n\nEvery developer out there needs at some point revising the output of a complicated query, the SQL Query Builder includes a human-friendly output method, and therefore the `writeFormatted` method is there to aid the developer when need. \n\nKeep in mind `writeFormatted` is to be avoided at all cost in production mode as it adds unneeded overhead due to parsing and re-formatting of the generated statement.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()-\u003esetTable('user');  \n\necho $builder-\u003ewriteFormatted($query);    \n\n```\n#### Output:\n```sql\nSELECT \n    user.* \nFROM \n    user\n```\n\nMore complicated examples can be found in the documentation.\n\n\n\u003ca name=\"block3\"\u003e\u003c/a\u003e\n## 3. Building Queries [↑](#index_block)\n\n\u003ca name=\"block3.1\"\u003e\u003c/a\u003e\n### 3.1. SELECT Statement [↑](#index_block) \n\n\n\n\u003ca name=\"block3.1.1\"\u003e\u003c/a\u003e\n#### 3.1.1. Basic SELECT statement [↑](#index_block)\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(['user_id','name','email']);\n     \necho $builder-\u003ewrite($query);    \n```\n#### Output:\n```sql\nSELECT user.user_id, user.name, user.email FROM user\n```\n\n\u003ca name=\"block3.1.2\"\u003e\u003c/a\u003e\n#### 3.1.2. Aliased SELECT statement [↑](#index_block) \n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(['userId' =\u003e 'user_id', 'username' =\u003e 'name', 'email' =\u003e 'email']);\n       \necho $builder-\u003ewrite($query);    \n```\n#### Output:\n```sql\nSELECT user.user_id AS 'userId', user.name AS 'username', user.email AS 'email' FROM user\n```\n\u003ca name=\"block3.1.3\"\u003e\u003c/a\u003e\n#### 3.1.3. SELECT with WHERE statement [↑](#index_block)\n\nDefault logical operator for filtering using `WHERE` conditions is `AND`.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns([\n        'userId' =\u003e 'user_id',\n        'username' =\u003e 'name',\n        'email' =\u003e 'email'\n    ])\n    -\u003ewhere()\n    -\u003egreaterThan('user_id', 5)\n    -\u003enotLike('username', 'John')\n\t-\u003eend();\n      \necho $builder-\u003ewriteFormatted($query);    \n```\n#### Output:\n```sql\nSELECT \n    user.user_id AS 'userId',\n    user.name AS 'username',\n    user.email AS 'email'\nFROM \n    user \nWHERE \n    (user.user_id \u003c :v1)\n    AND (user.username NOT LIKE :v2)\n```\n\n\u003ca name=\"block3.1.4\"\u003e\u003c/a\u003e\n#### 3.1.4. Complex WHERE conditions [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003ewhere()\n    -\u003eequals('user_id', 1)\n    -\u003eequals('user_id', 2)\n    -\u003esubWhere(\"OR\")\n    -\u003elessThan($column, 10)\n    -\u003egreaterThan('user_id', 100)\n\t-\u003eend();\n\necho $builder-\u003ewriteFormatted($query);\n```\n\n#### Output:\n```sql\nSELECT\n    user.*\nFROM\n    user\nWHERE\n    (user.user_id = :v1)\n    AND (user.user_id = :v2)\n    AND (\n        (user.user_id \u003c :v3)\n        OR (user.user_id \u003e :v4)\n    )\n```\n\n\u003ca name=\"block3.1.5\"\u003e\u003c/a\u003e\n#### 3.1.5. JOIN \u0026 LEFT/RIGHT/INNER/CROSS JOIN SELECT statements [↑](#index_block)\n\nSyntax for `JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `INNER JOIN`, `CROSS JOIN` work the exactly same way. \n\nHere's an example selecting both table and joined table columns and doing sorting using columns from both the table and the joined table.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns([\n            'userId'   =\u003e 'user_id',\n            'username' =\u003e 'name',\n            'email'    =\u003e 'email',\n            'created_at'\n    ])\n    -\u003eorderBy('user_id', OrderBy::DESC)\n    -\u003eleftJoin(\n        'news', //join table\n        'user_id', //origin table field used to join\n        'author_id', //join column\n         ['newsTitle' =\u003e 'title', 'body', 'created_at', 'updated_at']\n     )\n    -\u003eon()\n    -\u003eequals('author_id', 1); //enforcing a condition on the join column\n\n$query\n    -\u003ewhere()\n    -\u003egreaterThan('user_id', 5)\n    -\u003enotLike('username', 'John')\n\t-\u003eend();\n\n$query\n    -\u003eorderBy('created_at', OrderBy::DESC);\n\necho $builder-\u003ewriteFormatted($query); \n```\n#### Output:\n```sql\nSELECT \n    user.user_id AS 'userId',\n    user.name AS 'username',\n    user.email AS 'email',\n    user.created_at,\n    news.title AS 'newsTitle',\n    news.body,\n    news.created_at,\n    news.updated_at \nFROM \n    user \nLEFT JOIN \n        news\n    ON \n        (news.author_id = user.user_id) \n        AND (news.author_id = :v1)\nWHERE \n    (user.user_id \u003c :v2)\n    AND (user.username NOT LIKE :v3)        \nORDER BY \n    user.user_id DESC,\n    news.created_at DESC;\n```\n\n\u003ca name=\"block3.1.6\"\u003e\u003c/a\u003e\n#### 3.1.6. COUNT rows [↑](#index_block)\nCounting rows comes in 3 possible ways, using the ALL selector `*`, stating a column or stating a column and its alias.\n\n#### 3.1.6.1. Count using ALL selector\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n        -\u003esetTable('user')\n        -\u003ecount()\n\necho $builder-\u003ewrite($query);\n```\n\n#### Output:\n```sql\nSELECT COUNT(*) FROM user;\n```\n\n#### 3.1.6.2. Count using column as a selector\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n        -\u003esetTable('user')\n        -\u003ecount('user_id')\n\necho $builder-\u003ewrite($query);\n```\n\n#### Output:\n```sql\nSELECT COUNT(user.user_id) FROM user;\n```\n\n#### 3.1.6.3. Count using column as a selector\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n        -\u003esetTable('user')\n        -\u003ecount('user_id', 'total_users')\n\necho $builder-\u003ewrite($query);\n```\n\n#### Output:\n```sql\nSELECT COUNT(user.user_id) AS 'total_users' FROM user;\n```\n\n\u003ca name=\"block3.2\"\u003e\u003c/a\u003e\n### 3.2. INSERT Statement [↑](#index_block)\n\nThe `INSERT` statement is really straightforward.\n\n\u003ca name=\"block3.2.1\"\u003e\u003c/a\u003e\n#### 3.2.1 Basic INSERT statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003einsert()\n    -\u003esetTable('user')\n    -\u003esetValues([\n        'user_id' =\u003e 1,\n        'name'    =\u003e 'Nil',\n        'contact' =\u003e 'contact@nilportugues.com',\n    ]);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output\n```sql\nINSERT INTO user (user.user_id, user.name, user.contact) VALUES (:v1, :v2, :v3)\n```\n\n```php\n[':v1' =\u003e 1, ':v2' =\u003e 'Nil', ':v3' =\u003e 'contact@nilportugues.com'];\n```\n\n\u003ca name=\"block3.3\"\u003e\u003c/a\u003e\n### 3.3. UPDATE Statement [↑](#index_block)\n\nThe `UPDATE` statement works just like expected, set the values and the conditions to match the row and you're set. \n\nExamples provided below.\n\n\u003ca name=\"block3.3.1\"\u003e\u003c/a\u003e\n#### 3.3.1 Basic UPDATE statement [↑](#index_block)\nImportant including the the `where` statement is critical, or all table rows will be replaced with the provided values if the statement is executed.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eupdate()\n    -\u003esetTable('user')\n    -\u003esetValues([\n        'user_id' =\u003e 1,\n        'name' =\u003e 'Nil',\n        'contact' =\u003e 'contact@nilportugues.com'\n    ])\n    -\u003ewhere()\n    -\u003eequals('user_id', 1)\n\t-\u003eend();\n\n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nUPDATE \n    user \nSET\n    user.user_id = :v1,\n    user.name = :v2, \n    user.contact = :v3\nWHERE \n    (user.user_id = :v4)\n```\n```php\n[':v1' =\u003e 1, ':v2' =\u003e 'Nil', ':v3' =\u003e 'contact@nilportugues.com', ':v4' =\u003e 1];\n```\n\u003ca name=\"block3.3.2\"\u003e\u003c/a\u003e\n#### 3.3.2. Elaborated UPDATE statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Syntax\\OrderBy;\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eupdate()\n    -\u003esetTable('user')\n    -\u003esetValues([\n        'name' =\u003e 'UpdatedName',\n    ]);\n    \n$query\n    -\u003ewhere()\n    -\u003elike('username', '%N')\n    -\u003ebetween('user_id', 1, 2000)\n\t-\u003eend();\n        \n$query\n    -\u003eorderBy('user_id', OrderBy::ASC)\n    -\u003elimit(1);            \n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nUPDATE \n    user \nSET \n    user.name = :v1\nWHERE \n    (user.username LIKE :v2) \n    AND (user.user_id BETWEEN :v3 AND :v4)\nORDER BY \n    user.user_id ASC \nLIMIT :v5\n```\n\n\u003ca name=\"block3.4\"\u003e\u003c/a\u003e\n### 3.4. DELETE Statement [↑](#index_block)\n\nThe `DELETE` statement is used just like `UPDATE`, but no values are set. \n\nExamples provided below.\n\n\u003ca name=\"block3.4.1\"\u003e\u003c/a\u003e\n#### 3.4.1. Empty table with DELETE statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003edelete()\n    -\u003esetTable('user');\n   \n$sql = $builder-\u003ewrite($query);   \n```\n#### Output:\n```sql\nDELETE FROM user\n```\n\n\u003ca name=\"block3.4.2\"\u003e\u003c/a\u003e\n#### 3.4.2. Basic DELETE statement [↑](#index_block)\nImportant including the the `where` statement is critical, or all table rows will be deleted with the provided values if the statement is executed.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003edelete()\n    -\u003esetTable('user');\n\n$query\n    -\u003ewhere()\n    -\u003eequals('user_id', 100)\n\t-\u003eend();\n\n$query\n    -\u003elimit(1);\n   \n$sql = $builder-\u003ewrite($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nDELETE FROM user WHERE (user.user_id = :v1) LIMIT :v2\n```\n```php\n[':v1' =\u003e 100, ':v2' =\u003e 1];\n```\n\u003ca name=\"block3.4.2\"\u003e\u003c/a\u003e\n#### 3.4.2. Elaborated DELETE statement [↑](#index_block) \n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Syntax\\OrderBy;\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003edelete()\n    -\u003esetTable('user');\n    \n$query\n    -\u003ewhere()\n    -\u003elike('username', '%N')\n    -\u003ebetween('user_id', 1, 2000)\n\t-\u003eend();\n        \n$query\n    -\u003eorderBy('user_id', OrderBy::ASC)\n    -\u003elimit(1);            \n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nDELETE FROM \n    user \nWHERE \n    (user.username LIKE :v1) \n    AND (user.user_id BETWEEN :v2 AND :v3)\nORDER BY \n    user.user_id ASC \nLIMIT :v4\n```\n\n\n\n\u003ca name=\"block3.5\"\u003e\u003c/a\u003e\n### 3.5. INTERSECT Statement [↑](#index_block)\n\n***\n   INTERSECT is not supported by MySQL. \n   Same results can be achieved by using INNER JOIN statement instead.\n***\n\nThe `INTERSECT` statement is really straightforward.\n\n\u003ca name=\"block3.5.1\"\u003e\u003c/a\u003e\n#### 3.5.1 Basic INTERSECT statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$select1 = $builder-\u003eselect()-\u003esetTable('user');\n$select2 = $builder-\u003eselect()-\u003esetTable('user_emails');\n   \n$query = $builder-\u003eintersect()\n    -\u003eadd($select1)\n    -\u003eadd($select2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output\n```sql\nSELECT user.* FROM user\nINTERSECT\nSELECT user_email.* FROM user_email\n```\n\n\n\u003ca name=\"block3.6\"\u003e\u003c/a\u003e\n### 3.6. MINUS Statement [↑](#index_block)\n\n***\n   MINUS is not supported by MySQL. \n   Same results can be achieved by using a LEFT JOIN statement \n   in combination with an IS NULL or NOT IN condition instead.\n***\n\nThe `MINUS` statement is really straightforward.\n\n\u003ca name=\"block3.6.1\"\u003e\u003c/a\u003e\n#### 3.6.1 Basic MINUS statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$select1 = $builder-\u003eselect()-\u003esetTable('user');\n$select2 = $builder-\u003eselect()-\u003esetTable('user_emails');\n   \n$query = $builder-\u003eminus($select1, $select2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output\n```sql\nSELECT user.* FROM user\nMINUS\nSELECT user_email.* FROM user_email\n```\n\n\n\u003ca name=\"block3.7\"\u003e\u003c/a\u003e\n### 3.7. UNION Statement [↑](#index_block)\n\nThe `UNION` statement is really straightforward.\n\n\u003ca name=\"block3.7.1\"\u003e\u003c/a\u003e\n#### 3.7.1 Basic UNION statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$select1 = $builder-\u003eselect()-\u003esetTable('user');\n$select2 = $builder-\u003eselect()-\u003esetTable('user_emails');\n   \n$query = $builder-\u003eunion()\n    -\u003eadd($select1)\n    -\u003eadd($select2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output\n```sql\nSELECT user.* FROM user\nUNION\nSELECT user_email.* FROM user_email\n```\n\n\u003ca name=\"block3.8\"\u003e\u003c/a\u003e\n### 3.8. UNION ALL Statement [↑](#index_block)\n\nThe `UNION ALL` statement is really straightforward.\n\n\u003ca name=\"block3.8.1\"\u003e\u003c/a\u003e\n#### 3.8.1 Basic UNION ALL statement [↑](#index_block)\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$select1 = $builder-\u003eselect()-\u003esetTable('user');\n$select2 = $builder-\u003eselect()-\u003esetTable('user_emails');\n   \n$query = $builder-\u003eunionAll()\n    -\u003eadd($select1)\n    -\u003eadd($select2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output\n```sql\nSELECT user.* FROM user\nUNION ALL\nSELECT user_email.* FROM user_email\n```\n\n\n\n\u003ca name=\"block4\"\u003e\u003c/a\u003e\n## 4. Advanced Quering [↑](#index_block)\n\n\u003ca name=\"block4.1\"\u003e\u003c/a\u003e\n### 4.1. Filtering using WHERE [↑](#index_block)\nThe following operators are available for filtering using WHERE conditionals:\n\n```php\npublic function subWhere($operator = 'OR');\npublic function equals($column, $value);        \npublic function notEquals($column, $value);\npublic function greaterThan($column, $value);\npublic function greaterThanOrEqual($column, $value);\npublic function lessThan($column, $value);\npublic function lessThanOrEqual($column, $value);\npublic function like($column, $value);\npublic function notLike($column, $value);\npublic function match(array $columns, array $values);\npublic function matchBoolean(array $columns, array $values);\npublic function matchWithQueryExpansion(array $columns, array $values);\npublic function in($column, array $values);\npublic function notIn($column, array $values);\npublic function between($column, $a, $b);\npublic function notBetween($column, $a, $b);\npublic function isNull($column);\npublic function isNotNull($column);\npublic function exists(Select $select);\npublic function notExists(Select $select);\npublic function addBitClause($column, $value);    \npublic function asLiteral($literal);\n```\n\n\u003ca name=\"block4.2\"\u003e\u003c/a\u003e\n### 4.2. Changing WHERE logical operator [↑](#index_block)\n\n`WHERE` default's operator must be changed passing to the `where` method the logical operator `OR`.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003ewhere('OR')\n    -\u003eequals('user_id', 1)\n    -\u003elike('name', '%N%')\n\t-\u003eend();       \n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nSELECT user.* FROM user WHERE (user.user_id = :v1) OR (user.name LIKE :v2)\n```\n        \n\u003ca name=\"block4.3\"\u003e\u003c/a\u003e\n### 4.3. Grouping with GROUP BY and HAVING [↑](#index_block)\n\nDefault logical operator for joining more than one `HAVING` condition is `AND`.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns([\n        'userId'   =\u003e 'user_id',\n        'username' =\u003e 'name',\n        'email'    =\u003e 'email',\n        'created_at'\n    ])\n    -\u003egroupBy(['user_id', 'name'])\n    -\u003ehaving()\n    -\u003eequals('user_id', 1)\n    -\u003eequals('user_id', 2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nSELECT \n    user.user_id AS 'userId',\n    user.name AS 'username',\n    user.email AS 'email',\n    user.created_at \nFROM \n    user \nGROUP BY \n    user.user_id, user.name \nHAVING \n    (user.user_id = :v1)\n    AND (user.user_id = :v2)\n```\n\n\u003ca name=\"block4.3.1\"\u003e\u003c/a\u003e\n#### 4.3.1 Available HAVING operators  [↑](#index_block)\nSame operators used in the WHERE statement are available for HAVING operations.\n\n\u003ca name=\"block4.4\"\u003e\u003c/a\u003e\n### 4.4. Changing HAVING logical operator [↑](#index_block)\n\n`HAVING` default's operator must be changed passing to the `having` method the logical operator `OR`.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns([\n        'userId'   =\u003e 'user_id',\n        'username' =\u003e 'name',\n        'email'    =\u003e 'email',\n        'created_at'\n    ])\n    -\u003egroupBy(['user_id', 'name'])\n    -\u003ehaving('OR')\n    -\u003eequals('user_id', 1)\n    -\u003eequals('user_id', 2);\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nSELECT \n    user.user_id AS 'userId',\n    user.name AS 'username',\n    user.email AS 'email',\n    user.created_at \nFROM \n    user \nGROUP BY \n    user.user_id, user.name \nHAVING \n    (user.user_id = :v1)\n    OR (user.user_id = :v2)\n```\n\n\u003ca name=\"block4.5\"\u003e\u003c/a\u003e\n### 4.5. Columns as SELECT statements [↑](#index_block)\n\nSometimes, a column needs to be set as a column. SQL Query Builder got you covered on this one too! Check the example below.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$selectRole = $builder-\u003eselect()\n    -\u003esetTable('role')\n    -\u003esetColumns(array('role_name'))\n    -\u003elimit(1)\n    -\u003ewhere()\n    -\u003eequals('role_id', 3);\n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(array('user_id', 'username'))\n    -\u003esetSelectAsColumn(array('user_role' =\u003e $selectRole))\n    -\u003esetSelectAsColumn(array($selectRole))\n    -\u003ewhere()\n    -\u003eequals('user_id', 4)\n\t-\u003eend();\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nSELECT \n    user.user_id,\n    user.username,\n    (\n        SELECT \n            role.role_name \n        FROM \n            role \n        WHERE \n            (role.role_id = :v1) \n        LIMIT :v2, :v3\n    ) AS 'user_role', \n    (\n        SELECT \n            role.role_name  \n        FROM \n            role \n        WHERE \n            (role.role_id = :v4) \n        LIMIT :v5, :v6\n    ) AS 'role' \nFROM \n    user \nWHERE \n    (user.user_id = :v7)\n```\n\n\u003ca name=\"block4.6\"\u003e\u003c/a\u003e\n### 4.6. Columns being Values [↑](#index_block)\n\nThere are time where you need to force the same column structure (eg: UNIONs) even when lacking of a column or value. Forcing column with values gets you covered.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(array('user_id', 'username'))\n    -\u003esetValueAsColumn('10', 'priority')\n    -\u003ewhere()\n    -\u003eequals('user_id', 1)\n\t-\u003eend();\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n#### Output:\n```sql\nSELECT \n    user.user_id,\n    user.username,\n    :v1 AS 'priority' \nFROM \n    user \nWHERE\n    (user.user_id = :v2)\n```\n\n\u003ca name=\"block4.7\"\u003e\u003c/a\u003e\n### 4.7. Columns using FUNCTIONS [↑](#index_block)\n\nExample for MAX function.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(array('user_id', 'username'))\n    -\u003esetFunctionAsColumn('MAX', array('user_id'), 'max_id')\n    -\u003ewhere()\n    -\u003eequals('user_id', 1)\n\t-\u003eend(); \n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output:\n```sql\nSELECT \n    user.user_id,\n    user.username,\n    MAX(user_id) AS 'max_id'\nFROM \n    user\nWHERE\n    (user.user_id = :v1)\n```\n\nExample for CURRENT_TIMESTAMP function.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetColumns(array('user_id', 'username'))\n    -\u003esetFunctionAsColumn('CURRENT_TIMESTAMP', array(), 'server_time')\n    -\u003ewhere()\n    -\u003eequals('user_id', 1)\n\t-\u003eend();\n   \n$sql = $builder-\u003ewriteFormatted($query);    \n$values = $builder-\u003egetValues();\n```\n\n#### Output:\n```sql\nSELECT \n    user.user_id,\n    user.username,\n    CURRENT_TIMESTAMP AS 'server_time' \nFROM \n    user \nWHERE\n    (user.user_id = :v1)\n```\n\n\u003ca name=\"block5\"\u003e\u003c/a\u003e\n## 5. Commenting queries [↑](#index_block)\nThe query builder allows adding comments to all query methods by using the `setComment` method.\n\nSome useful use cases examples can be : \n\n - Explain difficult queries or why of its existence. \n - Finding slow queries from its comments.\n\n#### Usage:\n```php\n\u003c?php\nuse NilPortugues\\Sql\\QueryBuilder\\Builder\\GenericBuilder;\n\n$builder = new GenericBuilder(); \n\n$query = $builder-\u003eselect()\n    -\u003esetTable('user')\n    -\u003esetComment('This is a comment');\n    \n$sql = $builder-\u003ewrite($query);   \n```\n\n#### Output:\n```sql\n-- This is a comment\nSELECT user.* FROM user\n```\n\n\u003ca name=\"block6\"\u003e\u003c/a\u003e\n## 6. Quality Code [↑](#index_block)\nTesting has been done using PHPUnit and [Travis-CI](https://travis-ci.org). All code has been tested to be compatible from PHP 5.4 up to PHP 5.6 and [HHVM](http://hhvm.com/).\n\nTo run the test suite, you need [Composer](http://getcomposer.org):\n\n```bash\n    php composer.phar install --dev\n    php bin/phpunit\n```\n\n\n\u003ca name=\"block7\"\u003e\u003c/a\u003e\n## 7. Author [↑](#index_block)\nNil Portugués Calderó\n\n - \u003ccontact@nilportugues.com\u003e\n - [http://nilportugues.com](http://nilportugues.com)\n\n\n\u003ca name=\"block8\"\u003e\u003c/a\u003e\n## 8. License [↑](#index_block)\nSQL Query Builder is licensed under the MIT license.\n\n```\nCopyright (c) 2014 Nil Portugués Calderó\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n```\n","funding_links":["https://paypal.me/nilportugues"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnilportugues%2Fphp-sql-query-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnilportugues%2Fphp-sql-query-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnilportugues%2Fphp-sql-query-builder/lists"}