所以我有两个共享多对多关系的表:
1)Games
,其中包含用户创建的匹配信息和
2)Users
。
除了game
属于许多users
且user
属于许多games
的用户/游戏关系之外,还有一个{{1}的关系许多user
可以申请许多games
和game
申请。对于这种关系,我创建了一个名为users
的联结表。
我正在使用AdonisJs,因此我使用
设置模型requests
Games
和模型applicants () {
return this.belongsToMany(
'App/Models/User',
'game_id',
'applicant_id'
).pivotTable('requests')
}
与
Users
我需要查询应用于任何经过身份验证的用户游戏的所有用户(通过将所述用户的ID定义为applications () {
return this.belongsToMany(
'App/Models/Game',
'applicant_id',
'game_id'
).pivotTable('requests')
}
来定义)
当我使用代码时
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()
行。
我仍然试图控制查询数据库,所以我希望能够了解为什么会发生这种情况。
答案 0 :(得分:1)
您找到解决问题的方法了吗? 您的代码是正确的,只需替换
.firstOrFail()
通过
.fetch()
或
.findOrFail()
由于 firstOrFail 将仅返回与您的查询匹配的第一个元素
通常,要使用与adonisjs的关系时,您需要调用告诉lucid提取与查询匹配的元素的方法。
一旦检索到allUserGames,您将需要更新查询,使其与您的需求完全匹配。
firstOrFail 返回一个元素,而 findOrFail 和 fetch 将返回一个分页对象
const { rows: realUserGames } = allUserGames
完整的示例是
async getAllUserGames ({ auth, response }) {
const allUserGames = await Game.query()
.where('user_id', auth.current.user.id)
.with('applicants')
//.findOrFail()
.fetch()
const { rows: realUserGames } = allUserGames
return response.json({
status: 'success',
data: realUserGames
})
}