我遇到了陷入困境的问题:
Model 1: Guest - props {"slug":"string"}
Model 2: Project - props {"prefix":"string"}
Relation: Project has many guests
如何编写远程方法:findGuestWithProject(prefix, slug)
将返回guest
slug
(完全匹配但不区分大小写)和相关项目与精确prefix
?
我遇到的问题:
初始过滤器返回Guests
具有相似但不精确的段塞f.e.如果我通过"anna"
.find
可以使用slug "anna-maria"
返回客人,那么稍后我需要检查id slug是否完全相同。
初始过滤器返回Guests
并使用不同的project.prefix
,因此我需要执行额外的循环以找到完全匹配。
如果找不到匹配项,我需要计算迭代次数以返回回调。
Guest.getGuestProject = function(prefix, slug, cb) {
if (!prefix) return;
var pattern = new RegExp(slug, "i");
app.models.Project.findOne({
"where": {"prefix": prefix}
},(err, project) => {
if (err) { throw err};
if (!project) cb(null, null);
return project.guests({
"where": {"slug": pattern },
"include": {"relation": "project", "scope": {"include": {"relation": "rsvps"}}}
}, (err, guests) => {
if (guests.length === 0) cb(null, null)
guests.forEach(guest => {
if (guest.slug.toLowerCase() === slug.toLowerCase()) {
cb(null, guest)
}
})
})
})

答案 0 :(得分:1)
关于1:您的正则表达式正在检查包含slug
对于2和3我刚刚重写了它。你没有指定你正在使用的数据库连接器(mongodb,mysql,postgres等),所以我写了这个基于Postgresql的例子,这是我经常使用的,也是最坏情况之一,给出了关系数据库不支持嵌套属性的过滤。如果您使用的是Mongodb或Cloudant,请查看https://loopback.io/doc/en/lb3/Querying-data.html#filtering-nested-properties中提供的示例,因为此代码段可能更简单。
如果这个答案不是您想要的,那么我可能需要更多细节。我也使用promises而不是回调。
Guest.getGuestProject = function(prefix, slug) {
const Project = Guest.app.models.Project;
// First of all find projects with the given prefix
return Project.find({
where: {
prefix: prefix
},
include: 'guests'
}).then(projects => {
projects.forEach(project => {
let guests = project.guests();
guests.forEach(guest => {
// See if guest.slug matches (case-insensitive)
if (guest.slug.match(new RegExp(slug, 'i'))) {
return guest;
}
});
});
});
};