0
Well, I created a Many to Many relationship, just as I saw in the documentation, some posts and some videos on the internet, I was not successful in any attempt by some mistake of mine that I can’t identify.
The model:
Models/User.js
'use strict'
/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
const Model = use('Model')
/** @type {import('@adonisjs/framework/src/Hash')} */
const Hash = use('Hash')
class User extends Model {
static boot () {
super.boot()
/**
* A hook to hash the user password before saving
* it to the database.
*/
this.addHook('beforeSave', async (userInstance) => {
if (userInstance.dirty.password) {
userInstance.password = await Hash.make(userInstance.password)
}
})
}
/**
* A relationship on tokens is required for auth to
* work. Since features like `refreshTokens` or
* `rememberToken` will be saved inside the
* tokens table.
*
* @method tokens
*
* @return {Object}
*/
tokens () {
return this.hasMany('App/Models/Token')
}
questions(){
return this.belongsToMany('App/Models/Question','question_id','user_id','id','id')
}
static get traits () {
return [
'@provider:Adonis/Acl/HasRole',
'@provider:Adonis/Acl/HasPermission'
]
}
}
module.exports = User
Models/Question.js
'use strict'
/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
const Model = use('Model')
class Question extends Model {
alternatives(){
return this.hasOne('App/Models/Alternative','id','question_id')
}
users(){
return this.belongsToMany('App/Models/Users','user_id','question_id','id','id')
}
}
module.exports = Question
The controller:
Controllers/Http/Usercontroller.js
const User = use("App/Models/User")
const Question = use("App/Models/Question")
async storeQuestion({ request, response}) {
const {question, alternatives, user_id} = request.post()
const questionData = await Question.create(question)
if(alternatives){
await questionData.alternatives().create(alternatives)
await questionData.load('alternatives')
}
const user = User.find(user_id)
await user.questions().attach(questionData)
await user.load('questions')
return user
}
The Migration of the pivot table:
this.create('user_creates_question', (table) => {
table.increments()
table.integer('user_id').unsigned().references('users.id').onDelete('cascade').index('user_id')
table.integer('question_id').unsigned().references('questions.id').onDelete('cascade').index('question_id')
table.timestamps()
})
When I run the route that calls this controller, the following message is returned:
user.questions is not a Function
Although the Question and Alternative entity is created, the attach function is not finished().
you used this tutorial: https://adonisjs.com/docs/4.0/relationships#_belongs_to_many ?
– novic
Yes, I have. I don’t understand why questions() aren’t a "function" :(
– Henrique N. Mendes
You tested that line
const user = User.find(user_id)
to see if a real returnuser
?– novic
Yes, all commands work until you arrive await user.questions(). attach(questionData)
– Henrique N. Mendes
On the model in your question can you put it complete? both?
– novic
Done, I tried to avoid putting everything to not get too much, but there it is.
– Henrique N. Mendes