Запрос к базе данных с использованием «с» и не получение ожидаемого результата - PullRequest
0 голосов
/ 04 июня 2018

Итак, у меня есть две таблицы, которые имеют отношение многие ко многим:

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

Мне нужно запросить всех пользователей, которые обращались к любой из игр аутентифицированного пользователя (определяется с помощью указанного идентификатора пользователя как 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 Ответ

0 голосов
/ 27 июля 2018

Нашли решение для своей проблемы?Ваш код правильный, просто замените

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

Список литературы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...