所以我有两个表共享多对多关系:
Games
,其中包含用户和Users
.
除了用户/游戏关系game
属于许多人users
和一个user
属于许多人games
,还有一种关系user
可以申请很多games
和一个game
可以被很多人申请users
. 对于这种关系,我创建了一个名为requests
.
我用的是adonisjs,所以我设置了模型Games
具有
applicants () {
return this.belongsToMany(
'App/Models/User',
'game_id',
'applicant_id'
).pivotTable('requests')
}
模型呢 Users
具有
applications () {
return this.belongsToMany(
'App/Models/Game',
'applicant_id',
'game_id'
).pivotTable('requests')
}
我需要查询所有的用户,适用于任何一个认证用户的游戏(定义为说,用户的id为) user_id
)
当我使用代码时
async getAllUserGames ({ auth, response }) {
const allUserGames = await Game.query()
.where('user_id', auth.current.user.id)
.with('applicants')
.firstOrFail()
return response.json({
status: 'success',
data: allUserGames
})
}
它很管用,但和我以前一样 .firstOrFail()
我只从第一个有应用程序的游戏中得到信息。
如果我去掉这条线,它不会返回任何申请者,只返回用户的游戏,就好像我没有这条线一样 .with('applicants')
也。
我仍在努力掌握查询数据库的方法,因此,如果您能深入了解为什么会发生这种情况,我将不胜感激。
1条答案
按热度按时间xwbd5t1u1#
你找到解决问题的办法了吗?你的代码是正确的,只要替换
通过
或
因为firstorfail只返回与查询匹配的第一个元素
通常,当涉及到使用与adonisjs的关系时,您需要调用一个方法,该方法将告诉lucid获取与您的查询匹配的元素。
一旦您检索到allusergames,您将需要更新您的查询,以便它与您需要的完全匹配。
firstorfail返回单个元素,而findorfail和fetch将返回分页对象
完整的例子是
参考文献
https://adonisjs.com/docs/4.1/lucid#_findorfail
https://adonisjs.com/docs/4.1/relationships#_eagerloading