Reputation: 14891
I have 2 models
Book: id, name, data (json)
Author: id, name
I want to extend Book
model with method author
which return the author when query withRelated
. This could be easy to achieve with below snippet, provided that I have author_id
in Book
const Book = bookshelf.model('Book', {
tableName: 'books',
author() {
return this.belongsTo('Author', 'author_id', 'id')
}
})
But the problem is, author_id
is a property of data
(which is json type). I tried the snippet below but it not worked
const Book = bookshelf.model('Book', {
tableName: 'books',
author() {
return this.belongsTo('Author', `data->>'author_id'`, 'id')
}
})
If I am not allowed to have any changes in the origin models, how could I get author
in this case? Thanks in advance.
Upvotes: 2
Views: 401
Reputation: 14891
Came up with a solution that worked, a little bit tricky combination of related
and event hook
const Book = bookshelf.model('Book', {
tableName: 'books',
initialize: function() {
this.on('fetched', async function(model) {
model.set('author_id', (model.get('data') || {}).author_id || null)
const author = await model.related('author').fetch()
model.set('author', author)
})
},
author() {
return this.belongsTo('Author')
}
})
Upvotes: 1