2017-05-16 69 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; 
       } 
      }); 
     }); 
    }); 
};