Loopbackjs loopback model.find基于相关模型的参数

Loopbackjs loopback model.find基于相关模型的参数,loopbackjs,Loopbackjs,我遇到了一个问题,就是步履蹒跚: Model 1: Guest - props {"slug":"string"} Model 2: Project - props {"prefix":"string"} Relation: Project has many guests 如何编写远程方法:findGuestWithProject(前缀,slug)将返回guest和slug(精确匹配但不区分大小写)以及具有精确前缀的相关项目 我遇到的问题: 初始过滤器返回带有相似但不精确的slug f.e

我遇到了一个问题,就是步履蹒跚:

Model 1: Guest - props {"slug":"string"}

Model 2: Project - props {"prefix":"string"}

Relation: Project has many guests
如何编写远程方法:
findGuestWithProject(前缀,slug)
将返回
guest
slug
(精确匹配但不区分大小写)以及具有精确
前缀的相关项目

我遇到的问题:

  • 初始过滤器返回带有相似但不精确的slug f.e的来宾
  • 。如果我通过
    “anna”
    。find
    可以返回带有slug的来宾“anna maria”,因此稍后我需要检查id slug是否完全相同

  • 初始筛选器返回具有不同
    项目的
    来宾
    。前缀
    ,因此我需要执行额外的循环以找到精确匹配

  • 如果未找到匹配项,我需要计算返回回调的迭代次数

  • Guest.getGuestProject=函数(前缀、slug、cb){
    如果(!前缀)返回;
    var模式=新的RegExp(slug,“i”);
    app.models.Project.findOne({
    “where”:{“prefix”:prefix}
    },(错误,项目)=>{
    if(err){throw err};
    如果(!project)cb(null,null);
    返回项目。客人({
    “where”:{“slug”:pattern},
    “包括”:{“关系”:“项目”、“范围”:{“包括”:{“关系”:“rsvps”}}
    },(呃,客人)=>{
    if(guests.length==0)cb(null,null)
    guests.forEach(guest=>{
    if(guest.slug.toLowerCase()==slug.toLowerCase()){
    cb(空,来宾)
    }
    })
    })
    
    })
    关于1:您的regexp正在检查是否包含
    slug

    对于2和3,我刚刚重写了它。您还没有指定您正在使用的db连接器(mongodb、mysql、postgres等)因此,我基于Postgresql编写了这个示例,这是我通常使用的示例,也是最糟糕的情况之一,因为关系数据库不支持按嵌套属性进行过滤。如果您使用Mongodb或Cloudant,请查看中提供的示例,因为此片段可能更简单

    如果这个答案不是你想要的,那么我可能需要更多的细节。我也使用承诺而不是回电

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