https://github.com/acro5piano/knex-with-relations
A Knex plugin for batch loading table relations.
https://github.com/acro5piano/knex-with-relations
knex typescript
Last synced: 7 months ago
JSON representation
A Knex plugin for batch loading table relations.
- Host: GitHub
- URL: https://github.com/acro5piano/knex-with-relations
- Owner: acro5piano
- License: mit
- Created: 2021-08-28T05:34:57.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2023-10-28T09:59:00.000Z (almost 2 years ago)
- Last Synced: 2025-03-17T20:13:11.869Z (7 months ago)
- Topics: knex, typescript
- Language: TypeScript
- Homepage:
- Size: 109 KB
- Stars: 16
- Watchers: 2
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# knex-with-relations
A Knex plugin for batch loading table relations.
# Breaking changes on v2.0.0
`.withRelations` method was changed to `.withHasManyRelation`.
# Features
- Use `whereIn` clause to filter relations, which should be good for performance in the most of situations
- Provides convenient method to fetch both n-1 relation and 1-1 relation
- Plug and play, no special setup required# Install
```sh
yarn add knex-with-relations
```# Usage
```typescript
import 'knex-with-relations'import createKnex from 'knex'
export const knex = createKnex(dbConfig)
```And you are ready to go.
### `.withHasManyRelation`
```typescript
knex('users').withHasManyRelation(knex('posts'), 'id', 'user_id').then(console.log)// Result
{
id: 1,
posts: [
{
id: 1,
title: 'post 1',
user_id: 1,
},
],
}
```### `.withHasOneRelation`
```typescript
knex('users').withHasOneRelation(knex('posts'), 'id', 'user_id').then(console.log)// Result
{
id: 1,
posts: {
id: 1,
title: 'post 1',
user_id: 1,
},
}
```### Advanced Usage
You can also specify the attribute name. If not specified, it uses table name.
```typescript
knex('users')
.where({ id: 1 })
.withHasOneRelation(
knex('posts').orderBy('created_at', 'DESC').limit(1),
'id',
'user_id',
{ as: 'latest_post' } // <--- This renames the attribute name to `latest_post`. If no provided, it become `posts`.
)
.then(console.log)// Result
{
id: 1,
latest_post: {
id: 1,
title: 'post 1',
user_id: 1,
created_at: 'Wed Feb 22 05:23:47 PM JST 2023',
},
}
```# TODO
- [ ] Stronger TypeScript support. Currently it does not change type definition, meaning that child attributes are ignored. I tried to implement using `infer`, but no luck. If you are enough knowledge to implement it, please send a PR. Thanks.