使用“with”查询数据库,但未得到预期结果

cwtwac6a  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(382)

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

  1. Games ,其中包含用户和
  2. 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') 也。
我仍在努力掌握查询数据库的方法,因此,如果您能深入了解为什么会发生这种情况,我将不胜感激。

xwbd5t1u

xwbd5t1u1#

你找到解决问题的办法了吗?你的代码是正确的,只要替换

.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
  })
}

参考文献

https://adonisjs.com/docs/4.1/lucid#_findorfail
https://adonisjs.com/docs/4.1/relationships#_eagerloading

相关问题