2017-05-16 86 views
0

PARAM我有falowing情况的一个问题:回环model.find基于从相关模型

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

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

Relation: Project has many guests 

如何编写远程方法:findGuestWithProject(prefix, slug),将返回guestslug(完全一致,但不区分大小写)和相关项目与确切的prefix

问题我遇到过:有相似但不准确的蛞蝓F.E.

  1. 初始过滤回报Guests如果我通过"anna".find可以返回slug "anna-maria"的客人,所以稍后我需要检查id slug是否完全相同。

  2. 初始过滤返回Guests不同project.prefix所以我需要做额外的循环来找到完全匹配。

  3. 如果找不到匹配,我需要计算迭代来返回回调。

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

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