【问题标题】:Sequelize inside express route - include where model matches search termsSequelize inside express route - 包括模型匹配搜索词的位置
【发布时间】:2019-10-04 07:09:18
【问题描述】:

我有一个库存应用程序,它需要能够按需搜索大型 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)});
});

我们的库存应用程序设置为显示有关特定资产的数据,然后将其与包含资产所有者信息的联系人表相关联。我在这里要做的是在两个表中返回与用户搜索词匹配的任何结果。

我的关联设置正确,因为我使用非常相似的路由来填充未过滤的表。

我是不是想多了?还是我错过了一些简单的事情?任何输入将不胜感激:)

【问题讨论】:

  • 我突然想到,我可以在 SQL 中创建一个视图来处理所有这些......

标签: javascript angularjs express join sequelize.js


【解决方案1】:

答案!

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)});
});

这个设置一切正常,万岁!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多