user7616817
user7616817

Reputation: 347

ObjectionJs fetch entity with many to many relationship

I'm using knex-objection. I have a simple example of 3 tables: user, authority_user, authority where "user" and "authority" are joined together witha many to many relationship.

Relationship code:

static get relationMappings() {

    return {
        authorities: {
            relation: Model.ManyToManyRelation,
            modelClass: path.join(__dirname, 'Authority'),

            join: {
                from: 'user.id',
                through:{
                    from: 'user_authority.user_id',
                    to: 'user_authority.authority_id'
                },
                to: 'authority.id'
            }
        }
    }
}

The relationship works, i have inserted a user with one authority and checked it out. The problem is that eager loading a user with it's authorities returns an undefined authorities array like the following:

  User {
id: 2,
username: 'someuser',
email: '[email protected]',
password: '$2b$10$DztbTKBMsElxH0kk9nK8x.73bgl3W.rZnhzqFH5XRR2FSkYcROzm2',
is_active: 1,
created_at: '2021-12-28 18:10:30',
updated_at: '2021-12-28 18:10:30',
authorities: [ [Authority] ]

} ]

Here the authorities array is undefined whilei can clearly fetch relations and get my user's authorities with : await User.relatedQuery('authorities').for(2) which gives :

  sql: 'select `authority`.* from `authority` inner join `user_authority` on `authority`.`id` = `user_authority`.`authority_id` where `user_authority`.`user_id` in (?)'

RESULT: [ Authority { id: 1, name: 'ROLE_USER' } ]

EDIT: I tried to fetch a user with 2 authorities and this is the output:

User {
id: 3,
username: 'test',
email: '[email protected]',
password: '$2b$10$3GWQd5b2.JwIvtyyOi/0zOKogY7kOG2aJhUqdFhlYpFvisPgeI62u',
is_active: 1,
created_at: '2021-12-29 08:42:50',
updated_at: '2021-12-29 08:42:50',
authorities: [ [Authority], [Authority] ]

}

it seems like ObjectionJs "knows" about the 2 Authority objections, but they just don't "show up" and the authorities array is still undefined...

Upvotes: 1

Views: 1011

Answers (1)

M-Raw
M-Raw

Reputation: 839

You can use withGraphFetched when querying

await User
.query()
.withGraphFetched('[authorities]')
.findById(id)
.throwIfNotFound({message: "User not found."})
.then(async user=> { ...})

Upvotes: 2

Related Questions