使用“with”查询数据库并且未获得预期结果

时间:2018-06-04 13:39:41

标签: mysql many-to-many adonis.js

所以我有两个共享多对多关系的表:

1)Games,其中包含用户创建的匹配信息和

2)Users

除了game属于许多usersuser属于许多games的用户/游戏关系之外,还有一个{{1}的关系许多user可以申请许多gamesgame申请。对于这种关系,我创建了一个名为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()行。

我仍然试图控制查询数据库,所以我希望能够了解为什么会发生这种情况。

1 个答案:

答案 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
  })
}

参考