sequelize принадлежит ToMany, где фильтр - PullRequest
0 голосов
/ 08 октября 2018

Допустим, у меня есть следующие модели:

const Item = sequelize.define("Item", {
    active: { type: DataTypes.BOOLEAN, defaultValue: true },
    name: { type: DataTypes.STRING, allowNull: false },
    description: { type: DataTypes.TEXT } 
  });


const Partner = sequelize.define("Partner", {
    active: { type: DataTypes.BOOLEAN, defaultValue: true },
    name: { type: DataTypes.STRING, allowNull: false },
  });

Я связываю их следующим образом:

models.Item.belongsToMany(models.Partner, {
      as: "vendors",
      through: "PartnerDefaultItems"
    });

models.Partner.belongsToMany(models.Item, {
      as: "items",
      through: "PartnerDefaultItem"
    });

Я думаю, мои модели и ассоциации в порядке, потому что это создаст новуютаблица в базе данных с идентификаторами товара и партнера.

Сейчас!Я делаю пагинацию на стороне сервера с фильтрацией, и когда я выбираю партнера (или больше), я хочу вернуть только те элементы, которые связаны с выбранными партнерами.

Могу ли я сделать это только с одним запросом?

Например: мой веб-интерфейс отправляет запрос с partnerId: 1 ...

const res = await db.models.Item.findAll({
          where: {select every item with associated partnerId}
        });

// - пример связанной таблицы - //

partner_id: 1 item_id: 1 => partner.partnerId совпадает с partner_id, поэтому выберите элемент, где item.id = item_id

partner_id: 2 item_id: 2 => partner.partnerId не равно, не выбирайте

и т. Д....

Смысл в том, чтобы использовать один запрос для этого, без каких-либо необработанных sql.

1 Ответ

0 голосов
/ 08 октября 2018

Ваша структура запроса должна include связать таблицу и указать отношение through, а также where для вашего partnerId.Вы можете включить logging: true для отображения запроса SQL в консоли для дальнейшей отладки.

const res = await db.models.Item.findAll({
  include: [
    {
      model: db.models.Parter,
      as: 'partners',
      through: 'PartnerDefaultItem',
      where: {
        id: partnerId,
      },
    },
  ],
});
...