API Platform : recherches inclusives/exclusives avec multiples filtres, et recherche d'efficacité

C'est pas très clair

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Aujourd’hui j’aurais besoin d’un petit coup de main pour mieux comprendre ce qu’API Platform peut réaliser comme requêtes par défaut. Au final, je cherche la méthode la plus efficace en termes de ressources requises pour l’affichage final pour l’utilisateur :

  • plein de petites requêtes simples ?
  • une grosse requête très complexe ?
  • une grosse requête très simple et le tri fait par JS chez l’utilisateur ?

J’ai en BDD une série de données-bidon et je fais des tests avec API Platform et Symfony 5 pour les récupérer comme je le souhaite.

Notamment :

  • récupérer la liste des entités dispo entre deux dates
  • récupérer en plus les entités toujours dispo (boolean)
  • récupérer les entités qui ont tel ou tel tag (mais pas tel ET tel tag :euh: )

Je peux sans souci faire 3 requêtes, les 3 fonctionnent. Je peux ensuite merger les 3 tableaux de résultats.

Mais est-ce efficace ? Ne vaudrait-il pas mieux faire une seule requête ramenant toutes les entités (sans filtres) et laisser le front-end en javascript se charger de trier les données ? Comment savoir ce qui est le mieux pour l’utilisateur ? Je précise qu’on parle d’une BDD qui au final ne devrait pas gérer nettement plus de 200 entités simultanément (mais avec beaucoup de dates liées en Collection).

Revenons sur les requêtes avec API Platform : je n’arrive pas à comprendre clairement quand est-ce que les filtres se cumulent, et quand est-ce qu’ils s’excluent. Par exemple :

  • une requête http://localhost:8000/api/stores?openingHours.day[after]=2021-02-14&openingHours.day[before]=2021-02-20&isAlwaysOpened=true ne ramène aucun résultat. Si j’enlève la partie "isAlwaysOpened", j’ai bien une liste cohérente. Mais ça me simplifierait beaucoup la vie si il y avait moyen de dire : donne moi la liste "des stores ouverts entre telle date et telle date ET ceux ouverts tout le temps".

  • une requête http://localhost:8000/api/stores?categories[]=/api/categories/2&categories[]=/api/categories/3 me renvoie par contre la liste des stores ayant la catégorie 2 et celle des stores ayant la catégorie 3, alors qu’au contraire j’aurais aimé avoir la liste des stores qui ont les 2 catégories.

Le truc c’est que je ne perçois pas la différence avec la première requête et son "&isAlwaysOpened=true", or les deux ont le comportement inverse de celui que j’espérais ! Et vu que je ne comprends pas pourquoi, je n’arrive pas à corriger le tir.

Bref. Y a-t-il un pro d’API Platform par ici ?

Merci !

Bonjour,

Filtrer côté client apporte plusieurs inconvénients, dont les principaux sont :

  • Une surconsommation de données inutiles (car certaines ne seront pas affichées)
  • Une surconsommation de ressources (CPU) et donc de batterie
  • Il faut gérer la propagation du code du filtre. Il peut arriver que des clients utilisent une ancienne version et ils n’auront dans ce cas pas un filtre à jour

Sinon pour les exemples de filtres que tu donnes, dans le cas categories[]=/api/categories/2&categories[]=/api/categories/3 il s’agit d’un OU parceque tu ajoutes le suffixe [] au nom de la propriété, ce qui est traduit par un IN en SQL ;)

Également quand les filtres deviennent très spécifiques, il faut créer un CustomFilter.

Bon courage !

Merci ! C’est bien ce que je pensais pour l’utilisation des données, mais entre "penser que" et "savoir", il y a un vaste monde qui me reste à parcourir :) Quoi qu’il en soit, mes utilisateurs auront forcément un traitement des données à faire, c’est inévitable. Je vais tâcher de le réduire au minimum, toutefois.

Bon, ben c’est parti pour un tas de CustomFilters (oui j’ai essayé une syntaxe ?categories=api/categories/2&categories=api/categories/3, seule la dernière catégorie est prise en compte). C’est là où je regrette de ne pas avoir un soft comme PHP Storm qui pourrait m’auto-completer toutes les dépendances à appeler pour réussir. Ca va me prendre des jours !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte