IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[SQL/DQL] Filtrer avec un IN qui se comporte comme un 'AND' et non un 'OR'


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2018
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Novembre 2018
    Messages : 58
    Par défaut [SQL/DQL] Filtrer avec un IN qui se comporte comme un 'AND' et non un 'OR'
    C'est difficile à expliquer mais je vais faire de mon mieux,

    I want to filter an Association and I use EntityFilter for that, this association can have multiple value :
    Je veux filtrer une association et j'utilise l'EntityFilter qu'EasyAdmin propose, comme on peut le voir, j'attribue plusieurs valeurs :
    Nom : Capture d’écran 2022-07-20 à 19.36.43.png
Affichages : 397
Taille : 79,2 Ko

    Pour mon exemple, je recherche une personne qui est `illustrateur/dessinateur` et `Animateur/intervenant`.

    Dans mon Index(Crud) j'ai 3 personnes, une qui n'a pas d'activité, une qui en a les 2 (illustrateur/dessinateur et Animateur/intervenant) et la dernière qui n'en a qu'une (Animateur/intervenant)
    Nom : Capture d’écran 2022-07-20 à 19.40.24.png
Affichages : 359
Taille : 91,3 Ko

    Je filtre avec les 2 activités et 2 personnes sont retournées alors que je souhaite seulement avoir Farrah car c'est la seule qui a les 2 activitées.
    [![enter image description here][3]][3]

    J'ai donc regardé le code que propose EntityFilter et j'ai vu qu'il utilise la class Orx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    ```php
    if ($entityDto->isToManyAssociation($property)) {
                // the 'ea_' prefix is needed to avoid errors when using reserved words as assocAlias ('order', 'group', etc.)
                // see <a href="https://github.com/EasyCorp/EasyAdminBundle/pull/4344" target="_blank">https://github.com/EasyCorp/EasyAdminBundle/pull/4344</a>
                $assocAlias = 'ea_'.$filterDataDto->getParameterName();
                $queryBuilder->leftJoin(sprintf('%s.%s', $alias, $property), $assocAlias);
     
                if (0 === \count($value)) {
                    $queryBuilder->andWhere(sprintf('%s %s', $assocAlias, $comparison));
                } else {
                    $orX = new Orx();
                    $orX->add(sprintf('%s %s (:%s)', $assocAlias, $comparison, $parameterName));
                    if ('NOT IN' === $comparison) {
                        $orX->add(sprintf('%s IS NULL', $assocAlias));
                    }
                    $queryBuilder->andWhere($orX)
                        ->setParameter($parameterName, $this->processParameterValue($queryBuilder, $value));
                }
    ```
    Then I overided this filter and replaced `Orx` by `AndX` but still the same result
    J'ai overidé ce filtre et remplacé Orx par AndX mais j'ai obtenu le même résultat

    Ensuite j'ai testé avec un IN en pensant que ça résoudrait mon problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ```php
    foreach ($value as $item) {
        if ($comparison === 'NOT IN') {
            $queryBuilder->andWhere($queryBuilder->expr()->notIn($assocAlias, [$item->getId()]));
        } else {
            $queryBuilder->andWhere($queryBuilder->expr()->in($assocAlias, [$item->getId()]));
        } 
    }
    ```
    Mais en fait IN agit comme un OR et j'aimerais qu'il soit plus strict et agisse comme un AND. Y a-t-il un moyen de le faire se comporter ainsi pour résoudre ce problème de filtre ?

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 683
    Par défaut
    je ne connais pas symfony mais dans le cas général, j'aurais fait une boucle pour ajouter la liste de "AND".

Discussions similaires

  1. [CSS 3] Div en "Flex" et ancre qui se comporte comme un block ?
    Par cocaaladioxine dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 10/10/2016, 10h50
  2. [EJB3] Un Ejb Stateless qui se comporte comme unEjb Stateful
    Par clem_alain dans le forum Java EE
    Réponses: 5
    Dernier message: 04/02/2011, 12h00
  3. Applet qui se comporte comme un textarea ?
    Par Rakken dans le forum Applets
    Réponses: 1
    Dernier message: 10/11/2008, 16h26
  4. GUI qui se comporte comme VS
    Par AlligO dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/05/2008, 13h09
  5. Browser qui se comporte comme mozilla ou comme ie, etc.
    Par Bad_Lemon dans le forum Réseau
    Réponses: 5
    Dernier message: 25/04/2007, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo