2017-05-16 3 views
0

Ich habe ein Problem mit falowing Situation:Loopback model.find basierend auf param aus verwandtem Modell

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

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

Relation: Project has many guests 

Wie Remote-Methode schreiben: findGuestWithProject(prefix, slug) die guest mit slug (genauer Übereinstimmung aber Groß- und Kleinschreibung) zurück und verwandter Projekt mit genauen prefix?

Probleme die ich gestoßen:

  1. Initial Filter Rückkehr Guests mit ähnlichen, aber nicht genau Slug F. E. Wenn ich passiere "anna".find könnte Gäste mit Slug "anna-maria" zurückgeben, so später muss ich überprüfen ID Slug ist genau das gleiche.

  2. Erstes Filter zurück Guests mit verschiedenen project.prefix so muss ich extra Schleife zu finden, genau zu finden.

  3. Ich muss Iteration zählen, um Rückruf zurückzugeben, wenn keine Übereinstimmung gefunden wird.

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

Antwort

1

In Bezug auf 1: Ihr regexp ist für alles, was die Überprüfung slug

für 2 und 3 enthalten ich es gerade neu geschrieben habe. Sie haben nicht angegeben, welchen db-Konnektor Sie verwenden (mongodb, mysql, postgres, etc). Deshalb habe ich dieses Beispiel basierend auf Postgresql geschrieben, das ist das, das ich normalerweise verwende und eines der worst-case-Szenarien Relationale Datenbanken unterstützen das Filtern nach verschachtelten Eigenschaften nicht. Wenn Sie entweder Mongodb oder Cloudant verwenden, sehen Sie sich das Beispiel https://loopback.io/doc/en/lb3/Querying-data.html#filtering-nested-properties an, da dieses Snippet einfacher sein könnte.

Wenn diese Antwort nicht das ist, was Sie gesucht haben, dann werde ich wahrscheinlich mehr Details benötigen. Ich benutze auch Versprechen statt Rückrufe.

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