为什么Sequelize仅使用findAll()返回一个对象?

时间:2019-09-01 20:05:10

标签: javascript node.js express sequelize.js

我的目标是能够通过其品牌名称和型号名称找到所有产品。但是,Sequelize仅返回许多其他类似记录中的一个记录。如果确实返回多个记录,则其他属性与找到​​的第一个记录相同的其他记录将为null。例如,数组中的第一条记录将具有属性name: iPhone,而属性完全相同的第二条记录在应为name: null时将显示为name: iPhone

在我的数据库中,有以下表格:

ProductsBrandsModelsSuppliersProducts表包含外键,例如brand_idmodel_id等。BrandsModelsSuppliers具有属性:{ {1}}。

我已将关系设置如下:

id

在搜索功能中,我尝试按匹配我的查询的品牌和型号名称查找所有产品。

Products.hasOne(Brands, { foreignKey: 'id' });
Products.hasOne(Models, { foreignKey: 'id' });
Products.hasOne(Suppliers, { foreignKey: 'id' });

Brands.belongsTo(Products);
Models.belongsTo(Products);
Suppliers.belongsTo(Products);

在我的数据库中,我有两个产品行,它们的数据完全相同,但ID不同。调用const getSearch = (req, res) => { const { query: { query } } = req; Products.findAll({ where: Sequelize.where(Sequelize.fn('concat', Sequelize.col('Brand.name'), ' ', Sequelize.col('Model.name')), { [Op.substring]: query }), include: [ { model: Brands, attributes: ['name'] }, { model: Models, attributes: ['name'] }, { model: Suppliers, attributes: ['name'] }, ], attributes: ['id', 'price'] }) .then((data) => { console.log(data); res.send(data); }) .catch((err) => (console.log(err))); }; 时,我希望在数组中看到两个对象,因为它们具有相同的品牌名称和型号名称。相反,我看到了。

这是我的模型的样子:

产品

getSearch

模型

class Products extends Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        id: {
          type: DataTypes.INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        url_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        },
        brand_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        },
        model_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        },
        supplier_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        },
        image: {
          type: DataTypes.STRING,
          allowNull: true
        },
        description: {
          type: DataTypes.STRING,
          allowNull: true
        },
        price: {
          type: DataTypes.DOUBLE,
          allowNull: true
        }
      },
      {
        modelName: 'Products',
        timestamps: false,
        sequelize
      }
    );
  }
}

品牌

class Models extends Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        id: {
          type: DataTypes.INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        name: {
          type: DataTypes.STRING,
          allowNull: true
        },
        colour_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        },
        storage_capacity_id: {
          type: DataTypes.INTEGER,
          allowNull: true
        }
      },
      {
        modelName: 'Models',
        timestamps: false,
        sequelize
      }
    );
  }
}

供应商

class Brands extends Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        id: {
          type: DataTypes.INTEGER,
          primaryKey: true,
          autoIncrement: true
        },
        name: {
          type: DataTypes.STRING,
          allowNull: true
        }
      },
      {
        modelName: 'Brands',
        timestamps: false,
        sequelize
      }
    );
  }
}

我在这里做什么错了?

1 个答案:

答案 0 :(得分:0)

您的关联有误。只需将hasOne更改为hasMany就可以了。