我的目标是能够通过其品牌名称和型号名称找到所有产品。但是,Sequelize仅返回许多其他类似记录中的一个记录。如果确实返回多个记录,则其他属性与找到的第一个记录相同的其他记录将为null
。例如,数组中的第一条记录将具有属性name: iPhone
,而属性完全相同的第二条记录在应为name: null
时将显示为name: iPhone
。
在我的数据库中,有以下表格:
Products
,Brands
,Models
和Suppliers
。 Products
表包含外键,例如brand_id
,model_id
等。Brands
,Models
和Suppliers
具有属性:{ {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
}
);
}
}
我在这里做什么错了?
答案 0 :(得分:0)
您的关联有误。只需将hasOne更改为hasMany就可以了。