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 :
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)
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
Then I overided this filter and replaced `Orx` by `AndX` but still the same result
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)); } ```
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
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 ?
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()])); } } ```
Partager