2017-02-20 476 views
0

我想使用sequelize.js查询模型以查找包含约束的记录。我怎么做?Sequelize:查找所有匹配的内容(不区分大小写)

这就是我现在所拥有的:

Assets 
    .findAll({ limit: 10, where: ["asset_name like ?", '%' + request.body.query + '%'] }) 
    .then(function(assets){ 
    return response.json({ 
     msg: 'search results', 
     assets: assets 
    }); 
    }) 
    .catch(function(error){ 
    console.log(error); 
    }); 

,但我得到了以下错误:

{ error: operator does not exist: character varying @> unknown 
     at Connection.parseE (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:554:11) 
     at Connection.parseMessage (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:381:17) 
     at Socket.<anonymous> (/home/travellr/safe-star.com/SafeStar/node_modules/pg/lib/connection.js:117:22) 
     at emitOne (events.js:96:13) 
     at Socket.emit (events.js:188:7) 
     at readableAddChunk (_stream_readable.js:176:18) 
     at Socket.Readable.push (_stream_readable.js:134:10) 
     at TCP.onread (net.js:548:20) 
    name: 'error', 
    length: 209, 
    severity: 'ERROR', 
    code: '42883', 
    detail: undefined, 
    hint: 'No operator matches the given name and argument type(s). You might need to add explicit type casts.', 
    position: '246', 
    internalPosition: undefined, 
    internalQuery: undefined, 
    where: undefined, 
    schema: undefined, 
    table: undefined, 
    column: undefined, 
    dataType: undefined, 
    constraint: undefined, 
    file: 'parse_oper.c', 
    line: '722', 
    routine: 'op_error', 
    sql: 'SELECT "id", "asset_name", "asset_code", "asset_icon", "asset_background", "asset_add_view", "asset_add_script", "asset_add_id_regex", "date_created", "uniqueValue", "createdAt", "updatedAt" FROM "assets" AS "assets" WHERE "assets"."asset_name" @> \'%a%\' LIMIT 10;' }, 
    sql: 'SELECT "id", "asset_name", "asset_code", "asset_icon", "asset_background", "asset_add_view", "asset_add_script", "asset_add_id_regex", "date_created", "uniqueValue", "createdAt", "updatedAt" FROM "assets" AS "assets" WHERE "assets"."asset_name" @> \'%a%\' LIMIT 10;' } 

如何使用一个包含sequelize查询?

回答

0
Assets.findAll({ 
     limit: 10, 
     where: { 
      asset_name: { 
       $like: '%' + request.body.query + '%' 
      } 
     } 
}).then(function(assets){ 
    return response.json({ 
     msg: 'search results', 
     assets: assets 
    }); 
}).catch(function(error){ 
    console.log(error); 
}); 

编辑

为了使其不区分大小写,您可以使用SQL LOWER功能,但以前你也不得不降低情况下,你request.body.query值。然后Sequelize查询将看起来像

let lookupValue = request.body.query.toLowerCase(); 

Assets.findAll({ 
    limit: 10, 
    where: { 
     asset_name: sequelize.where(sequelize.fn('LOWER', sequelize.col('asset_name')), 'LIKE', '%' + lookupValue + '%') 
    } 
}).then(function(assets){ 
    return response.json({ 
     msg: 'message', 
     assets: assets 
    }); 
}).catch(function(error){ 
    console.log(error); 
}); 

它的作用是降低的情况下,从表中你asset_name值,以及较低的情况下,request.body.query值。在这种情况下,您会比较两个较低的套管字符串。

为了更好地理解在这种情况下发生了什么,我建议您查看关于sequelize.where(),sequelize.fn()以及sequelize.col()的续集文档。这些功能在尝试执行一些不寻常的查询时非常有用,而不是简单的findAllfindOne

在这种情况下sequelize当然是你的Sequelize实例。

+0

谢谢!!!有没有办法做到不区分大小写? A ++ – ryanwaite28

+0

我已经更新了答案,现在应该不区分大小写。 – piotrbienias

+0

如果您使用的是PG,您可以使用''[Op.iLike]:\'%$ {request.body.query}%\'',然后跳过低级的cruft。 – Scott