loopback model.find 基于相关模型的参数
loopback model.find based on param from related model
我对以下情况有疑问:
Model 1: Guest - props {"slug":"string"}
Model 2: Project - props {"prefix":"string"}
Relation: Project has many guests
如何编写远程方法:findGuestWithProject(prefix, slug)
将 return guest
与 slug
(完全匹配但不区分大小写)和相关项目与 prefix
?
我遇到的问题:
初始过滤器 return Guests
具有相似但不完全的 slug f.e。如果我通过 "anna"
.find
可以 return 带有 slug "anna-maria"
的客人,所以稍后我需要检查 id slug 是否完全相同。
初始过滤器 return Guests
有不同的 project.prefix
所以我需要做额外的循环来找到完全匹配。
如果找不到匹配项,我需要将迭代计数到 return 回调。
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)
}
})
})
})
关于 1:您的正则表达式正在检查任何包含 slug
的内容
对于 2 和 3,我刚刚重写了它。您还没有指定您使用的是什么数据库连接器(mongodb、mysql、postgres 等),所以我基于 Postgresql 编写了这个示例,这是我经常使用的一个,也是其中之一最坏的情况,假设关系数据库不支持通过嵌套属性进行过滤。如果您使用的是 Mongodb 或 Cloudant,请查看 https://loopback.io/doc/en/lb3/Querying-data.html#filtering-nested-properties 中提供的示例,因为此代码段可能更简单。
如果这个答案不是您想要的,那么我可能需要更多详细信息。我也在使用承诺而不是回调。
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;
}
});
});
});
};
我对以下情况有疑问:
Model 1: Guest - props {"slug":"string"}
Model 2: Project - props {"prefix":"string"}
Relation: Project has many guests
如何编写远程方法:findGuestWithProject(prefix, slug)
将 return guest
与 slug
(完全匹配但不区分大小写)和相关项目与 prefix
?
我遇到的问题:
初始过滤器 return
Guests
具有相似但不完全的 slug f.e。如果我通过"anna"
.find
可以 return 带有 slug"anna-maria"
的客人,所以稍后我需要检查 id slug 是否完全相同。初始过滤器 return
Guests
有不同的project.prefix
所以我需要做额外的循环来找到完全匹配。如果找不到匹配项,我需要将迭代计数到 return 回调。
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)
}
})
})
})
关于 1:您的正则表达式正在检查任何包含 slug
对于 2 和 3,我刚刚重写了它。您还没有指定您使用的是什么数据库连接器(mongodb、mysql、postgres 等),所以我基于 Postgresql 编写了这个示例,这是我经常使用的一个,也是其中之一最坏的情况,假设关系数据库不支持通过嵌套属性进行过滤。如果您使用的是 Mongodb 或 Cloudant,请查看 https://loopback.io/doc/en/lb3/Querying-data.html#filtering-nested-properties 中提供的示例,因为此代码段可能更简单。
如果这个答案不是您想要的,那么我可能需要更多详细信息。我也在使用承诺而不是回调。
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;
}
});
});
});
};