# QueryBuilder
## Requirements
+ PHP 8+ (Should work with 7+, but haven't tested it).
+ `Psr\Container\ContainerInterface` implementation like [`php-di/php-di`](https://packagist.org/packages/php-di/php-di).
## Installation
```composer.json```
```
{
...
"repositories": [
{
"type": "git",
"url": "https://git.provm.cl/ProVM/query_builder.git"
}
],
"require": {
...
"provm/query_builder": "^1.0",
...
},
...
}
```
## Setup
```
$container->set(Database\Define\Query\Select::class, function(Psr\Container\ContainerInterface $container) {
return $container->get(ProVM\Database\Query\MySQL\Select::class);
});
$container->set(Database\Define\Query\Insert::class, function(Psr\Container\ContainerInterface $container) {
return $container->get(ProVM\Database\Query\MySQL\Insert::class);
});
$container->set(Database\Define\Query\Update::class, function(Psr\Container\ContainerInterface $container) {
return $container->get(ProVM\Database\Query\MySQL\Update::class);
});
$container->set(Database\Define\Query\Delete::class, function(Psr\Container\ContainerInterface $container) {
return $container->get(ProVM\Database\Query\MySQL\Delete::class);
});
```
## Usage
QueryBuilder
```
include_once 'vendor/autoload.php';
$qb = new QueryBuilder();
$query = $qb->select(<*columns>);
$query = $qb->insert(
);
$query = $qb->update();
$query = $qb->delete();
```
### Queries
#### Select
`SELECT FROM [ JOIN ON . = .][ WHERE [ AND|OR ]][ GROUP BY [, ]][ HAVING [ AND|OR ]][ ORDER BY ASC|DESC[, ASC|DESC]]`
Mysql also include `[ LIMIT [ OFFSET ]]`
```
$query = $qb->select(); // use '*' for columns
or
$query = $qb->select()->select(['id', 'column1',]);
or
$query = $qb->select(['id', 'column1',]);
$query->from('table1');
$query->joins([['table2', 'table1.column1 = table2.column21'],]);
$query->where(['table2.column22 = 10',]);
$query->groupBy(['table1.column1',]);
$query->having(['table1.column1 < 10',]);
$query->orderBy(['table2.column22',]);
$query->limit(10, 10);
```
#### Insert
`INSERT INTO [ ()]`
with two options
`` or
` VALUES ()`
```
$query = $qb->insert('table');
$query->columns(['column1',]);
$query->values(['value1',];
or
$query->select($select_query);
```
#### Update
`UPDATE SET = [, = ][ WHERE [ AND|OR ]]`
```
$query = $qb->update('table');
$query->set([['column1', 10],]); or $query->set([['column' => 'column1', 'value' => 10],]);
$query->where(['column2 = 10', ]);
```
#### Delete
`DELETE FROM WHERE [ AND|OR ]`
```
$query = $qb->delete('table');
$query->where(['column1 = 10',]);
```
Pass the query to a string
```
$str = $query->build();
or
$str = "{$query}";
```
## TODO
Implement other databases