@dharapvj/typeorm-simple-query-parser
Version:
TypeORM Query Parser
204 lines (135 loc) • 4.6 kB
Markdown
Typeorm Query Parser is url string parser for typeorm.
```console
npm i typeorm-simple-query-parser
```
```typescript
import { Get, QueryParams, Param } from 'routing-controllers';
import { RequestQueryParser } from 'typeorm-simple-query-parser';
import { MainRepository } from 'typeorm-simple-query-parser';
export class UserController {
@Get('/users')
public async getAll(@QueryParams() parseResourceOptions: RequestQueryParser) {
const resourceOptions = parseResourceOptions.getAll();
return await this.userRepository.getManyAndCount(resourceOptions);
}
@Get('/users/:id')
public async getOne(@Param('id') id: number, @QueryParams() parseResourceOptions: RequestQueryParser) {
const resourceOptions = parseResourceOptions.getAll();
return await this.userRepository.getOneById(id, resourceOptions);
}
}
export class UserRepository extends MainRepository<User> {
//
}
```
By default, we support these param names:
**filter** - filter GET result by AND type of condition
**filterByOr** - filter GET result by OR type of condition
**relations** - receive joined relational resources in GET result (with all or selected fields)
**sortByDesc** - sort GET result by some field in DESC order
**sortByAsc** - sort GET result by some field in ASC order
**limit** - limit the amount of received resources
**page** - receive a portion of limited amount of resources
### Filters
The way a filter should be formed is:
```console
/users?filter[columnName][operator][not]=value
```
* **columnName** - (Required) - Name of column you want to filter.
* **operator** - (Optional | Default: `eq`) Type of operator you want to use.
* **not** - (Optional | Default: `false`) Negate the filter (Accepted values: yes|true|1).
#### Example filters
Filter all users whose id start with `1000`.
```console
/users?filter[name][sw]=1000
```
Filter all books whose author is `Gentrit`.
```console
/books?filter[author.name]=Gentrit
```
Filter all users whose name start with `Gentrit` or ends with `Abazi`.
```console
/users?filter[name][sw]=Gentrit&filterByOr[name][ew]=Abazi
```
Type | Description
---- | -----------
ct | String contains
sw | Starts with
ew | Ends with
eq | Equals
gt | Greater than
gte| Greater than or equalTo
lt | Lesser than
lte | Lesser than or equalTo
in | In array
bt | Between
Two parameters are available: limit and page. limit will determine the number of records per page and page will determine the current page.
```console
/books?limit=10&page=3
```
Will return books number 30-40.
The `sortByAsc` and `sortByDesc` query parameters are used to determine by which property the results collection will be ordered.
The following query parameter `sortByAsc` will sort results by from the lowest value to the highest value:
```console
/books?sortByAsc=id
```
The following query parameter `sortByDesc` will sort results by from the highest value to the lowest value:
```console
/books?sortByDesc=id
```
You can sort multiple columns separating them with a comma:
```console
/books?sortByDesc=id,name
```
The `relations` query parameter will load any relation on the resulting models.
The following query parameter will include the `logs` relation:
```url
/users?relations=logs
```
Users will have all their their `logs` related models loaded.
You can load multiple relationships by separating them with a comma:
```url
/users?relations=logs,tasks
```
You can load nested relationships using the dot `.` notation:
```url
/users?relations=logs.causer
```
You also can control relations, limit and more in controller like this:
```ts
@Get('/users')
public async getAll(@QueryParams() parseResourceOptions: RequestQueryParser) {
const resourceOptions = parseResourceOptions.getAll();
resourceOptions.skip = 1;
return await this.userRepository.getManyAndCount(resourceOptions);
}
```
You also can control relations with scopes and conditions:
```ts
@Get('/users')
public async getAll(@QueryParams() parseResourceOptions: RequestQueryParser) {
const resourceOptions = parseResourceOptions.getAll();
resourceOptions.scopes = [
{
name: "posts",
condition: "{alias}.active = :active",
parameters: { active: true },
}
]
return await this.userRepository.getManyAndCount(resourceOptions);
}
```