2015-05-07 5 views
18

ich ein Modell, in dem es drei Einheiten:Wie bauen EXISTS-Klausel in sequelize

User 
Project 
Contributor 

Ein Projekt einen Besitzer hat (der ein Mitglied ist) und mehrere Teilnehmer hat (die User sind). In meinem Dashboard möchte ich die Projekte eines Benutzers auflisten, d. H. Alle Projekte, in denen der Benutzer ein Eigentümer oder ein Mitwirkender ist.

Finden von eigenen Projekten mit Project.findAll({where: [owner: user]}) ist trivial. Wie ändere ich das, um die Projekte herauszufinden, in denen der Benutzer auch Beiträge leistet? Dies würde (in der Datenbankabfrage) mit der EXISTS-Klausel in eine Unterabfrage umgesetzt.

Antwort

5

Zum Beispiel definieren wir als nächsten Verband:

Project.belongsToMany(User, {through: 'Contributor'}); 
User.belongsToMany(Project, {through: 'Contributor'}); 

Project.belongsTo(User, { as: 'Owner', foreignKey: 'owner'}); 

Wenn Sie Projekte zu finden, wo der Benutzer ist ein Beitrag, und der Besitzer zugleich Sie es wie folgt tun:

user.getProjects({ where: {owner: user.id} }); 
1

kein Sequelize Benutzer hier, aber das Lesen der Dokumente sieht aus wie Sie können einfach verwenden $ enthält Operator in Ihrem wo Klausel. So etwas wie:

Project.findAll({ 
    where: { 
     owner: user, 
     contributors: { 
      $contains: [user.id] 
     } 
    } 
}); 
+0

$ enthält Maps für den PostgreSQL-Operator '@>' für Array-Typen und funktioniert nicht für Beziehungen zwischen Entitäten. – yjo