loopback model.find基于相关模型的param

时间:2017-05-16 16:58:59

标签: loopbackjs

我遇到了陷入困境的问题:

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

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

Relation: Project has many guests

如何编写远程方法:findGuestWithProject(prefix, slug)将返回guest slug(完全匹配但不区分大小写)和相关项目与精确prefix

我遇到的问题:

  1. 初始过滤器返回Guests具有相似但不精确的段塞f.e.如果我通过"anna" .find可以使用slug "anna-maria"返回客人,那么稍后我需要检查id slug是否完全相同。

  2. 初始过滤器返回Guests并使用不同的project.prefix,因此我需要执行额外的循环以找到完全匹配。

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

  4. 
    
      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 个答案:

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