1
votes

Chaînage des requêtes avec sequelize

Dans sequelize, je veux faire quelque chose comme le chaînage des appels de fonction findAll.

Je voudrais faire un findAll sur un modèle comme

const get5ThAvenueInhabitants = (citiesInhabitants) => {
  return await citiesInhabitants.findAll({ where: { street: '5th Avenue' } });
};

get5ThAvenueInhabitants(newYorkers);

puis utiliser newYorkers comme paramètre pour une fonction, qui fait un autre findAll là-dessus

const newYorkers = await People.findAll({ where: { city: 'New York' } });

Cela ne fonctionnera pas, car après le premier findAll, le résultat n'est pas un modèle plus, mais un tableau de résultats.

Est-il possible d'y parvenir avec sequelize?


0 commentaires

3 Réponses :


0
votes

Si tout ce que vous voulez faire est de trouverToutes les personnes qui vivent à New York et 5th Avenue , pourquoi n'utilisez-vous pas et opérateur?

Ce serait aussi simple que


const newYorkers = People.findAll({ 
  where: { 
       city: 'New York',
       street: '5th Avenue',
      },
    ],
  },
});


1 commentaires

Je veux filtrer les données avant de les utiliser comme paramètre pour get5ThAvenueInhabitants. Je ne veux pas donner à get5ThAvenueInhabitants la table entière.



0
votes

Tout d'abord, à part ce que vous demandez, je ne comprends pas la logique derrière la fonction get5ThAvenueInhabitants () . Comme la réponse précédente, vous pouvez filtrer directement en utilisant où: {ville: 'New York', rue: '5th Avenue'} . Il n'est pas nécessaire d'interroger d'abord «New York», puis «5th Avenue».

Revenons maintenant sur ce que vous demandez vraiment, à propos du chaînage de la requête, vous pouvez utiliser async / await comme ceci:

const mainFunction = async () => {
    const newYorkers = await People.findAll({ where: { city: 'New York' } });
    get5ThAvenueInhabitants(newYorkers);
}

De cette façon, les newYorkers attendront que toutes les données soient récupérées, puis passeront à get5ThAvenueInhabitants () .

p >


2 commentaires

Oui, j'ai oublié l'attente dans mon exemple. Je l'ai édité en ce moment. Mais je ne pense pas que cela fonctionne maintenant. Le findAll dans get5ThAvenueInhabitants sera appelé sur un tableau d'instances. Mais findAll ne fonctionne qu'avec les modèles.


C'est ce que je veux dire, vous ne pouvez pas réellement appeler findAll sur newYorkers , vous pouvez utiliser filter pour le faire, mais encore une fois. pas vraiment nécessaire lorsque vous pouvez le faire à la fois sur la première requête.



0
votes

Comme vous le mentionnez, People.findAll ({where: {city: 'New York'}}); renvoie un tableau d ' instances et non un modèle . L'objet instance expose des méthodes telles que destroy , update , etc., et vous pouvez donc, dans un sens, faire une sorte de requête " chaining ", en utilisant les méthodes sur une instance retournée, comme ceci:

 People.findAll({ where: { city: 'New York' } }).then(people => {
     people.filter(person => {
        if(person.street === '5th Avenue'){
            return person;
        }
     })
 });

Pour filtrer la collection retournée dans le code de votre application, par opposition à l'utilisation d'une requête DB, vous pouvez faire quelque chose comme ceci :

People.findAll({ where: { city: 'New York' } }).then(people => {
     people.forEach(person => {
         person.destroy();
     })
 });


1 commentaires

La solution pour utiliser filter pour les prochaines "requêtes" serait mon approche, s'il n'y a pas de possibilité d'enchaîner les findAll s. Mais je me demande si les performances de Array.filter seront aussi bonnes que celles de findAll .