Как использовать .findAll и найти записи из двух разных таблиц и ссылку на себя?

В частности, я работаю с двумя таблицами. Пользователи и друзья. У пользователей есть куча информации, которая определяет пользователя, тогда как у друзей есть два столбца, кроме id: user_id и friend_id, где оба они являются ссылкой на таблицу User.

Я пытаюсь найти всех друзей пользователей с помощью как можно меньшего количества обращений к базе данных, и в настоящее время у меня их 2. Один для получения идентификатора пользователя сначала из запроса, а затем другой для друзей, где я сравниваю идентификаторы из первый вызов, а затем третий вызов, который передает массив друзей и находит их всех в таблице пользователей. Это уже кажется излишеством, и я думаю, что с ассоциациями должен быть лучший способ.

Изменение таблиц, к сожалению, не вариант.

Одна вещь, которую я увидел на "http://docs.sequelizejs.com/manual/querying.html#relations---associations"

Я попытался, но получил интересную ошибку.. при попытке переназначить фрагмент кода в ссылке в разделе «Отношения/ассоциации» я получаю сообщение «пользователь несколько раз связан с друзьями». Чтобы определить правильную связь, вы должны использовать ключевое слово «как», чтобы укажите псевдоним ассоциации, которую вы хотите включить».

      const userRecord = await User.findOne({
        where: { id }
      })

      const friendsIDs = await Friends.findAll({
        attributes: ["friend_id"],
        where: {
          user_id: userRecord.id
        }
      }).then(results => results.map(result => result.friend_id));

      const Sequelize = require("sequelize");
      const Op = Sequelize.Op;

      return await User.findAll({
        where: {
          id: { [Op.in]: friendsIDs }
        },
      });

Выше для моего варианта использования работает. Мне просто интересно, есть ли способы сократить количество обращений к БД.


person user3026715    schedule 26.03.2019    source источник
comment
Почему вы вызываете этот запрос, поскольку у вас уже есть идентификатор пользователя. const userRecord = await User.findOne({ where: {id } }) Пробовали ли вы использовать присоединение к таблице друзей, если да, укажите запрос, который вы использовали? Вы добавили user_id и friend_id в качестве внешнего ключа в таблицу друзей?   -  person Pankaj Jindal    schedule 26.03.2019
comment
Почему бы не использовать необработанный SQL-запрос? Поскольку ваше требование не требует каких-либо данных об ассоциациях окончательного findAll. SELECT * FROM пользователей, где id IN (SuB QUERY). Даже если вы не хотите полностью использовать необработанный SQL, вы можете использовать - where: Sequelize.literal((Sub Query));   -  person Rohit Dalal    schedule 26.03.2019
comment
@PankajJindal да user_id и friend_id являются внешними ключами в таблице друзей. Я не уверен, что понимаю путаницу. Интерфейсная часть выполняет вызов определенной внутренней конечной точки и передает user_id для поиска друзей.   -  person user3026715    schedule 26.03.2019
comment
@ user3026715 ваша проблема решена или вы все еще сталкиваетесь с ней?   -  person Pankaj Jindal    schedule 29.03.2019
comment
Оказывается, Sequelize справится с этим за вас, если у вас есть правильные ассоциации, так что да, для меня это был один лайнер user.getFriends().   -  person user3026715    schedule 29.03.2019


Ответы (1)


Оказывается, Sequelize справится с этим за вас, если у вас есть правильные ассоциации, так что да, для меня это был один лайнер user.getFriends().

person user3026715    schedule 29.03.2019