Как использовать .findAll и найти записи из двух разных таблиц и самостоятельную ссылку? - PullRequest
0 голосов
/ 26 марта 2019

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

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

Модификация таблиц, к сожалению, не вариант.

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

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

      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 }
        },
      });

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

1 Ответ

0 голосов
/ 29 марта 2019

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

...