Как исключить связь, принадлежащую многим, из экземпляра в sequelize? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь исключить модель соединения из запроса с ассоциацией модели, вот как они связаны:

Warehouse.associate = function(models) {
  Warehouse.Products = Warehouse.belongsToMany(models.Product, {
    as: {
      singular: 'product',
      plural: 'products',
    },
    through: models.WarehouseProducts,
    foreignKey: "warehouse_id",
    otherKey: "product_id",
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE'
  });
}

Product.associate = function(models) {
  Product.Warehouses = Product.belongsToMany(models.Warehouse, {
    as: {
      singular: "warehouse",
      plural: "warehouses"
    },
    through: models.WarehouseProducts,
    foreignKey: "product_id",
    otherKey: "warehouse_id",
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE'
  });
}

И это код, который я использую для получения продуктасклада:

export const prefetchWarehouse =  [
  validator.params.warehouse,
  async function(req, res, next) {
    try {
      if (validator.errors(req)) {
        throw validator.stack;
      } else {
        req.warehouse = await Warehouse.findById(req.params.warehouse);
        next();
      }
    } catch (err) {
      next(err);
    }
  }
];

export const getProduct = [
  validator.params.product,
  async function(req, res, next) {
    const result = await req.warehouse.getProducts({
      where: {
        id: {
          [Op.eq]: req.params.product
        }
      },
      plain: true
    });
    console.log('===>', result);
  }
]

И это вывод:

enter image description here Есть ли способ избежать возврата этой ассоциации?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я столкнулся с этим поведением, и решил его, просто установив joinTableAttributes в пустой массив, как, например, joinTableAttributes: [].

export const getProduct = [
  validator.params.product,
  async function(req, res, next) {
    const result = await req.warehouse.getProducts({
      joinTableAttributes: [], // Here
      where: {
        id: {
          [Op.eq]: req.params.product
        }
      },
      plain: true
    });
    console.log('===>', result);
  }
]

Надеюсь, что это поможет вам.

0 голосов
/ 01 декабря 2018

Один из способов решить эту проблему - использовать модель соединения в моем обработчике, чтобы избежать этого:

export function WarehouseProducts(WarehouseProducts) {
  WarehouseProducts.associate = function(models) {
    WarehouseProducts.Products = WarehouseProducts.belongsTo(models.Product, {
      as: "product"
    });
  };
}

А затем в обработчике:

const result = await WarehouseProducts.findOne({
  where: {
    warehouse_id: { [Op.eq]: req.params.warehouse },
    product_id: { [Op.eq]: req.params.product }
  },
  include: [ "product" ]
});

res.json(result.product);

Хотя было бы неплоходелать так, как я искал, потому что та же функция prefetchWarehouse повторно используется в других конечных точках, так что это поможет избежать.Хотя код выглядит более оптимизированным, но в любом случае, если у кого-то есть какие-либо предложения, я был бы признателен.

Спасибо.

...