我有一个清单应用程序,它需要能够按需搜索大型SQL数据集(65k条记录)的功能。今天,当我使用include参数时遇到了一个问题。看起来是这样的:
//Get all records for passed search term
router.get('/getSearchData', function(req,res,next){
models.assets.findAll({
attributes: [
'Owner', 'Barcode', 'SerialNum', 'Model', 'Last_Seen_Date', 'OrderNum',
'Item_Status', 'Equipment_Type', 'Comments', 'AssignedLevel', 'Acquired_Date',
'Issued_Date', 'Warranty_Exp_Date', 'Surplus_Date'
],
where: {
[Op.or]: [
{ Owner: { [Op.like]: '%'+req.query.string+'%'} },
{ Barcode: { [Op.like]: '%'+req.query.string+'%'} },
{ SerialNum: { [Op.like]: '%'+req.query.string+'%'} },
{ Model: { [Op.like]: '%'+req.query.string+'%'} },
{ Last_Seen_Date: { [Op.like]: '%'+req.query.string+'%'} },
{ OrderNum: { [Op.like]: '%'+req.query.string+'%'} },
{ Item_Status: { [Op.like]: '%'+req.query.string+'%'} },
{ Equipment_Type: { [Op.like]: '%'+req.query.string+'%'} },
{ Comments: { [Op.like]: '%'+req.query.string+'%'} },
{ AssignedLevel: { [Op.like]: '%'+req.query.string+'%'} },
{ Acquired_Date: { [Op.like]: '%'+req.query.string+'%'} },
{ Issued_Date: { [Op.like]: '%'+req.query.string+'%'} },
{ Warranty_Exp_Date: { [Op.like]: '%'+req.query.string+'%'} },
{ Surplus_Date: { [Op.like]: '%'+req.query.string+'%'} }
]
},
include: [
{ model: models.contacts, as: 'contacts',
where: {
[Op.or]: [
{ Alias: { [Op.like]: '%'+req.query.string+'%'} },
{ Last_Name: { [Op.like]: '%'+req.query.string+'%'} }
]
}
}
],
order: [ [ 'Barcode', 'desc' ] ]
}).then( response => { res.send(response);
}).catch(error => { return next(error)});
});
我们的库存应用程序设置为显示有关特定资产的数据,然后将其绑定到包含有关资产所有者信息的联系人表。我要在这里做的是在两个表中返回与用户搜索词匹配的所有结果。
我正确设置了关联,因为我使用的是非常相似的路由来填充未过滤的表。
我是否想得太多?还是我错过了一些简单的事情?任何输入将不胜感激:)
答案 0 :(得分:0)
答案!
Sequelize正在以一种奇怪的方式格式化我的查询,添加一个AND语句,并将我的查询字符串附加到此查询的联接内,而不是WHERE子句中。
解决方案是使用Top level where with eagerly loaded models.应用链接文档中的解决方案,我的路线现在看起来像这样:
router.get('/getSearchData', function(req,res,next){
models.assets.findAll({
attributes: [
'Owner', 'Barcode', 'SerialNum', 'Model', 'Last_Seen_Date', 'OrderNum',
'Item_Status', 'Equipment_Type', 'Comments', 'AssignedLevel', 'Acquired_Date',
'Issued_Date', 'Warranty_Exp_Date', 'Surplus_Date'
],
where: {
[Op.or]: [
// Assets columns
{ Owner: { [Op.like]: '%'+req.query.string+'%'} },
{ Barcode: { [Op.like]: '%'+req.query.string+'%'} },
{ SerialNum: { [Op.like]: '%'+req.query.string+'%'} },
//Other Columns......
// Contacts columns
{ '$contacts.Alias$': { [Op.like]: '%'+req.query.string+'%'} },
{ '$contacts.Last_Name$': { [Op.like]: '%'+req.query.string+'%'} },
// Models Columns
{ '$models.Manufacturer$': { [Op.like]: '%'+req.query.string+'%'} },
{ '$models.Device_Type$': { [Op.like]: '%'+req.query.string+'%'} }
]
},
include: [
{ model: models.contacts, as: 'contacts' },
{ model: models.models, as: 'models' }
],
order: [ [ 'Barcode', 'desc' ] ]
}).then( response => { res.send(response)
}).catch(error => { return next(error)});
});
万事俱备,万岁!