2017-06-04 5 views
2

J'ai trois modèles, User, Project et ProjectMember. Garder les choses simples, les modèles ont les attributs suivants:

User 
    - id 

Project 
    - id 
    - owner_id 
    - is_published 

ProjectMember 
    - user_id 
    - project_id 

Utilisation sequelize.js, je veux trouver tous les projets où le propriétaire du projet est un utilisateur spécifique, ou où il est membre du projet pour ce projet dont l'utilisateur est cet utilisateur, ou où le projet est publié. Je suppose que le SQL brut ressemblerait à quelque chose comme ceci:

SELECT p.* 
FROM Project p 
LEFT OUTER JOIN ProjectMember m 
    ON p.id = m.project_id 
WHERE m.user_id = 2 
    OR p.owner_id = 2 
    OR p.is_published = true; 

Il y a beaucoup d'exemples là-bas sur la façon d'effectuer une requête sur une association, mais je ne peux trouver aucune sur la façon de le faire sous condition. Je suis en mesure d'interroger simplement l'association en utilisant ce code:

projModel.findAll({ 
    where: { }, 
    include: [{ 
     model: memberModel, 
     as: 'projectMembers', 
     where: { 'user_id': 2 } 
    }] 
}) 

Comment puis-je combiner cette requête où dans un $ ou pour vérifier colonnes OWNER_ID et is_published du projet?

Répondre

1

C'est frustrant, j'ai travaillé pendant des heures pour essayer de résoudre ce problème, et dès que je demande ici j'ai trouvé un moyen de le faire. Il s'avère que les développeurs de sequelize.js ont récemment ajouté la possibilité d'utiliser des clés brutes dans votre requête where, ce qui permet (enfin) d'interroger une association à l'intérieur de la clause where principale.

C'est ma solution:

projModel.findAll({ 
    where: { 
     $or: { 
      '$projectMembers.user_id$': 2, 
      owner_id: 2, 
      is_published: true 
     } 
    }, 
    include: [{ 
     model: memberModel, 
     as: 'projectMembers' 
    }] 
}) 

Remarque: cette solution casse si vous utilisez 'limite' dans les options de trouver. Vous pouvez également récupérer tous les résultats, puis les limiter manuellement par la suite.

+0

cela donne une erreur et je sais que la documentation dit la même chose –

+0

'SequelizeEagerLoadingError: Le client est associé à Deal en utilisant un alias. Vous avez inclus un alias (abc), mais il ne correspond pas à l'alias défini dans votre association. » –

+0

@MuhammadUmer Il est impossible de savoir sans plus de code, mais il semble que vous ayez mal défini vos modèles. Là encore, je ne suis pas un expert. Avez-vous essayé de poser une question sur SO? – aboveyou00