https://github.com/xtompie/aql
https://github.com/xtompie/aql
Last synced: 6 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/xtompie/aql
- Owner: xtompie
- Created: 2021-12-02T18:09:56.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-09-05T09:25:26.000Z (almost 2 years ago)
- Last Synced: 2026-01-04T12:52:17.981Z (7 months ago)
- Language: PHP
- Size: 51.8 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Array Query Language
- [Array Query Language](#array-query-language)
- [Requiments](#requiments)
- [Installation](#installation)
- [Docs](#docs)
- [Api](#api)
- [Select](#select)
- [Prefix](#prefix)
- [From](#from)
- [Join](#join)
- [Group](#group)
- [Having](#having)
- [Order](#order)
- [Limit](#limit)
- [Offset](#offset)
- [Where](#where)
- [String key](#string-key)
- [Int key and string value](#int-key-and-string-value)
- [Int key and array value](#int-key-and-array-value)
- [Insert](#insert)
- [Platform](#platform)
- [Extending](#extending)
Building SQL prepared statment with binds using array
```php
use Xtompie\Aql\Aql;
use Xtompie\Aql\MySQLPlatform;
$aql = new Aql(
platform: new MySQLPlatform(),
);
$result = $aql([
'select' => '*',
'from' => 'order',
'where' => [
'status' => 'active',
],
'limit' => 3,
]);
$result->sql(); // 'SELECT * FROM `order` WHERE status = ? LIMIT 3'
$result->binds(); // ['active']
$result->toArray(); // ['SELECT * FROM `order` WHERE status = ? LIMIT 3', ['active']]
```
## Requiments
PHP >= 8.0
## Installation
Using [composer](https://getcomposer.org/)
```shell
composer require xtompie/aql
```
## Docs
### Api
#### Select
```php
$aql(['select' => 'post_id', 'title' => 'post_title'])->toArray();
// ["SELECT post_id, post_title as 'title'", []];
$aql(['select' => 'post_id, post_title as title'])->toArray();
// ['SELECT post_id, post_title as title', []];
$aql(['select' => '|x' => '|COUNT(*)'])->toArray();
// ['SELECT COUNT(*) as x', []];
```
The `|` character can be specified at the beginning of key or value to use the raw sql fragment
#### Prefix
```php
$aql(['prefix' => 'SQL_NO_CACHE DISTINCT'])->toArray();
// ['SELECT SQL_NO_CACHE DISTINCT', []];
```
#### From
```php
$aql(['from' => 'user'])->toArray();
// ['FROM user', []];
$aql(['from' => ['u' => 'user']])->toArray();
// ['FROM user as u', []];
$aql(['from' => 'order'])->toArray();
// ['FROM `order`', []];
```
Keywords are quoted.
#### Join
```php
$aql([
'join' => [
'JOIN author ON (author_id = post_id_author)',
'LEFT JOIN img ON (author_id_img = img_id)'
]
])->toArray();
// ['JOIN author ON (author_id = post_id_author) LEFT JOIN img ON (author_id_img = img_id)"]
```
#### Group
```php
$aql(['group' => 'post_id'])->toArray();
// ['GROUP post_id', []];
```
#### Having
```php
$aql(['having' => 'post_id > 0'])->toArray();
// ['HAVING post_id > 0', []];
$aql(['having' => ['post_id >' => '0']])->toArray();
// ['HAVING post_id > ?', [0]];
```
Array of conditions can be set as having.
It behaves as where conditions.
See [Where](#where).
#### Order
```php
$aql(['order' => 'created_at DESC'])->toArray();
// ['ORDER BY created_at DESC', []];
```
Order is a raw sql fragment.
#### Limit
```php
$aql(['limit' => '10'])->toArray();
// ['LIMIT ?', [10]];
```
Limit is casted to int.
#### Offset
```php
$aql(['offset' => '20'])->toArray();
// ['OFFSET ?', [20]];
```
Offset is casted to int.
#### Where
##### String key
```php
$aql([
'where' => [
'a' => 'a',
'b' => ['b1', 'b2', 'b3'],
'c BETWEEN' => [2, 5],
'd <>' => 'd1',
'e LIKE' => '%e1%',
'f:gt' => 9,
]
])
->toArray()
;
// [
// 'WHERE a = ? AND b IN (?, ?, ?) AND c BETWEEN ? AND ? AND d <> ? AND e LIKE ? AND f > ?',
// ['a', 'b1', 'b2', 'b3', 2, 5, 'd1', '%e1%', 9]
// ];
```
When condition key is a string then expected is column name with optional comparison operator.
Compartition operator is expected after first space or `:` character.
Available compartition operators are all valid SQL comparition operators and aditional:
`eq` is `=`,
`gt` is `>`,
`ge` is `>=`,
`lt` is `<`,
`le` is `<=`,
`not`, `neq` is `!=`,
`like` is `LIKE`,
`in` is `IN`,
`notin` is `NOT IN`,
`between` is `BETWEEN`,
`notbetween` is `NOT BETWEEN`,
The `|` character can be specified at the beginning of key to use the raw sql fragment.
By default logical operator for all condition is `AND`.
Logical operator can by change using `:operator` key.
```php
$aql([
'where' => [
'a' => 'a',
'b' => 'b',
':operator' => 'OR',
]
])
->toArray()
;
// [
// 'WHERE a = ? OR b = ?',
// ['a', 'bb']
// ];
```
##### Int key and string value
```php
$aql(['where' => ['category_id IS NOT NULL']])->toArray();
// ['WHERE category_id IS NOT NULL', []];
```
##### Int key and array value
```php
$aql([
'where' => [
'a' => 'aa',
[
'b' => 'bb',
'c' => 'cc',
':operator' => 'OR',
]
]
])->toArray();
// ['WHERE a = ? AND (b = ? OR c = ?)', ['aa', 'bb', 'cc]];
```
#### Insert
```php
$aql([
'insert' => 'order',
'values' => [
'order' => 1,
'|time' => 'NOW()',
]
])->toArray();
// ['INSERT INTO `order` (`order`, time) VALUES (?, NOW())', [1]];
```
### Platform
Build in supported platforms:
- `Xtompie/Aql/MySQLPlatform`,
- `Xtompie/Aql/PostgreSQLPlatform`.
- `Xtompie/Aql/SQLitePlatform`.
Using `PostgreSQL`:
```php
use Xtompie/Aql/Aql;
use Xtompie/Aql/PostgreSQLPlatform;
(new Aql(platform: new PostgreSQLPlatform()))([
'SELECT' => '*',
'FROM' => 'order'
])->toArray();
// ['SELECT * FROM "order"', []];
```
### Extending
By decorating
```php
$paging->offset();
$aql['limit'] => $paging->limit();
unset($aql['paging']);
}
return ($this->aql)($aql);
}
}
```