Assuming
users:
- id
- name
post_user:
- post_id
- user_id
posts:
- id
- title
Using Knex query builder:
import Dataloader from 'dataloader'
const postsByUserId = new Dataloader((ids: readonly ID[]) => {
const select = (userId: ID) =>
this.database.knex
.select('posts.*', 'user_id as userId')
.from('posts')
.innerJoin(
'post_user',
'post_user.user_id',
'post_user.post_id',
)
.where('post_user.user_id', userid)
const [initial, ...rest] = ids
const union = rest.reduce(
(built, userId) => built.unionAll(select(userId), true),
select(initial),
)
return union.then((rows) =>
ids.map((id) => rows.filter((x: any) => x.userId === id)),
)
})