Ватерлиния найти модель, в которой RegExp
Вопрос
Я пытаюсь создать простую функцию поиска в SailsJS (бета-версия), используя ORM ватерлинии для обработки данных.Моя функция в моем контроллере выполняет поиск, используя предопределенный метод find() ватерлинии.
Интересно, можно ли отправить шаблон регулярного выражения SQL в функцию find() ватерлинии, чтобы она извлекала всех пользователей, имеющих соответствующий REGEXP?
Мой метод поиска в моем контроллере содержит это (кроме функции регулярного выражения, о которой я прошу):
// Replace any spaces with SQL regex wildcards
var regexp = req.body.search.replace(' ', '*');
// Show found users
User.find()
.where({
or: [
{username: { contains: req.body.search }},
{email: { contains: req.body.search }},
{fullName: { regexp: regexp }}
]
}).exec(function(err, users){
if (err){
return res.send(403, 'Failed to find users' + JSON.stringify(err));
}
res.view('userlist', {
users: users
});
});
А fullName
Атрибут определяется как метод экземпляра внутри атрибутов и, вероятно, недоступен для поиска.Однако есть ли способ сделать достойный поиск по именам?
Это выдержка из моей модели пользователя:
module.exports = {
attributes: {
firstName: {
type: 'string'
},
lastName: {
type: 'string'
},
fullName: function(){
return this.firstName + ' ' + this.lastName;
},
(...some more attributes, as well as email and username...)
}
}
Как мне сделать find()
-метод работы с регулярным выражением SQL?Моя цель — сделать так, чтобы поиск по запросу «Hans Eikerol» отображал в наборе результатов «Hans Martin Eikerol».
Решение
Карты ватерлиний .find()
к основному find
синтаксис базы данных, к которой вы подключены.Он не поддерживает регулярные выражения, поскольку регулярное выражение поддерживается не всеми адаптерами базы данных.Можно возразить, что, поскольку в наши дни поиск по регулярным выражениям входит в стандартную комплектацию большинства основных баз данных, эта функция может иметь место в Waterline, но пока вы можете использовать .query
выполнить собственный SQL-запрос.Затем вы возвращаете результаты к моделям Waterline.Например, с sails-mysql
:
User.query("[some sql query using RLIKE]", function(err, rows) {
if (err){
return res.send(403, 'Failed to find users' + JSON.stringify(err));
}
res.view('userlist', {
// Map the rows returned by the query to Waterline instances
users: rows.map(function(row){return new User._model(row);});
});
});
Другие советы
Автор Редактировать:
Спасибо за ответ :) Однако мне удалось найти подходящее решение моей проблемы без необходимости использовать поиск по шаблону регулярных выражений.Это мой новый метод контроллера:
var split = req.body.search.split(' ');
// Assume last piece of search is the lastName, ignore middlenames
var firstName = split[0];
var lastName = split.pop();
// Show found users
User.find()
.where({
or: [
{username: { contains: req.body.search }},
{email: { contains: req.body.search }},
{firstName: { contains: firstName }},
{lastName: { contains: lastName }},
{firstName: {startsWith: firstName}, lastName: lastName}
]
}).exec(function(err, users){
if (err){
return res.send(403, 'Failed to find users' + JSON.stringify(err));
}
res.view('admin/users', {
users: users
});
});
thanks a lot for your answer, I have implemented something like this, using waterline on sails:
.find({ $and:[{"userType":"basic"},{"name":{contains:req.params.name}} ] })
.exec(function(err,seller){
if(err){
res.send(err);
}else{
console.log(seller);
res.send(seller)
}
})