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 guestslug(完全匹配但不区分大小写)和相关项目与 prefix?

我遇到的问题:

  1. 初始过滤器 return Guests 具有相似但不完全的 slug f.e。如果我通过 "anna" .find 可以 return 带有 slug "anna-maria" 的客人,所以稍后我需要检查 id slug 是否完全相同。

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

  3. 如果找不到匹配项,我需要将迭代计数到 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;
                }
            });  
        });
    });  
};