Directus API : requête multiples

Bonjour,

Savez-vous comment je peux récupérer une liste en fonction de plusieurs critères ? car avec :

 _myMusic =
          List<MusicModel>.from(await _apiManager.findListOfItems<MusicModel>(
              filter: PropertyFilter(
                  field: "exploitant",
                  operator: FilterOperator.equals,
                  value: _directusUser.id),
              ));
      return _myMusic.toList();

J’obtiens une première List, mais je dois ensuite la filtrer en fonction d’autres paramètres (3), ce qui reviendrait à produire 3 requêtes et à filtrer avec des For… mais il doit forcément y avoir plus simple non ? car ajouter plusieurs filtres dans la première requête n’est pas possible.

Merci !

Oui c’est prévu. Il faut que tu utilises un LogicialOperatorFilter. Cet objet est une sous classe de Filteret il a deux propriétés :

  • operator qui attend un LogicalOperator. Il n’y en a que deux LogicalOperator.or pour les « ou » et LogicalOperator.and pour les « et »

  • children qui attend une liste de Filter

Par exemple, comme ci-dessous :

final Filter filter = LogicalOperatorFilter(
                      operator: LogicalOperator.or,
                      children: [
                PropertyFilter(
                    field: "requestor",
                    operator: FilterOperator.equals,
                    value: _connectedUser!.id),
                PropertyFilter(
                    field: "receiver",
                    operator: FilterOperator.equals,
                    value: _connectedUser!.id),
              ]));

ce filtre va me trouver tous les items de ma collection si requestor est égale à l’id de mon utilisateur ou si receiver est égale à l’id de mon utilisateur.

Merci @jmjoary ! Je vais jouer avec ça cet après-midi !

Mickaël.

Hello,

Est-ce que les filtres fonctionnent aussi sur les dates ?

J’essaie avec le code suivant :

 final Filter filter =
        await LogicalOperatorFilter(operator: LogicalOperator.and, children: [
      PropertyFilter(field: "user_id", operator: FilterOperator.equals, value: userId),
      PropertyFilter(field: "start_task", operator: FilterOperator.greaterThanOrEqual, value: start)
      PropertyFilter(field: "end_task", operator: FilterOperator.lessThanOrEqual, value: end),
    ]);

Mes variables start et end sont bien de type DateTime.

Et j’obtiens à chaque fois une erreur 500 :

DirectusApiError (DirectusApiError : null : 500 {« errors »:[{« message »:« Maximum call stack size exceeded »,« extensions »:{« code »:« INTERNAL_SERVER_ERROR »}}]}

ça n’apporte pas de réponse, mais je viens de tester : j’ai exactement la même erreur, ça met le serveur en échec

Problème résolu en sur Directus 10.4.3 en « castant » les variables DateTime en String :

    final Filter filter =
        await LogicalOperatorFilter(operator: LogicalOperator.and, children: [
      PropertyFilter(field: "user_id", operator: FilterOperator.equals, value: userId),
      PropertyFilter(
          field: "start_task",
          operator: FilterOperator.greaterThanOrEqual,
          value: firstDay.toString()),
      PropertyFilter(
          field: "end_task",
          operator: FilterOperator.lessThanOrEqual,
          value: lastDay.toString()),
    ]);
1 « J'aime »