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?
3 Réponses :
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', }, ], }, });
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.
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 >
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.
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(); }) });
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
.