2 pièce(s) jointe(s)
[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 :
Pièce jointe 622659
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)
Pièce jointe 622660
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:
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:
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 ?