2015-05-07 10 views
18

ho un modello in cui ci sono 3 soggetti:Come costruire EXISTS clausola sequelize

User 
Project 
Contributor 

un progetto ha un proprietario (che è un utente) e ha più contribuito (che sono gli utenti). Nella mia bacheca, voglio elencare i progetti di un utente, ovvero tutti i progetti in cui l'utente è un proprietario o un collaboratore.

Trovare progetti di proprietà utilizzando Project.findAll({where: [owner: user]}) è banale. Come posso modificare questo per scoprire i progetti in cui l'utente è anche un contributore? Questo sarebbe (nella query del database) tradurre in una sottoquery utilizzando la clausola EXISTS.

risposta

5

Per esempio definiamo prossimi associazioni:

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

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

Se si desidera trovare progetti in cui l'utente è un collaboratore e il proprietario, allo stesso tempo si può fare in questo modo:

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

non un utente di Sequelize ma leggendo i documenti sembra che tu possa semplicemente utilizzare l'operatore $ nella tua clausola. Qualcosa del tipo:

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

$ contiene mappe per l'operatore '@>' di PostgreSQL per i tipi di array e non funziona per le relazioni tra entità. – yjo