Beste tweakers,
Ik ben een website aan het bouwen waarop men adhv verschillende criteria naar producten kan zoeken. Sommige van deze producten kunnen meerdere criteria tegelijk hebben, vandaar dat ik het nuttig vind een AND/OR optie te voorzien (bijvoorbeeld ik wil een stoel die zowel zwart als wit is tov ik wil zwarte of witte stoelen). Ik zal verder in mijn uitleg conceptueel een stoel als voorbeeld blijven gebruiken.
Voor dit project in kwestie gebruik ik Symfony 3 en de Doctrine 2 querybuilder. Stel ik heb 2 Entities Chair en Color die gemapt zijn aan 3 tabellen chair, chair_has_color en color.
De gebruiker vraagt in zijn zoekopdracht naar 3 kleuren stoelen:
Stel dat hij alle stoelen met de opgegeven kleuren wil (OR), kan dit eenvoudig met een IN statement:
Hoe kan ik een query schrijven zodat de gebruiker een stoel kan opvragen die deze 3 kleuren tesamen heeft (AND)?
Bovenstaande manier van werken werkt alleszins niet omdat een enkele record niet meer dan 1 ID kan hebben. Ik zou met een subquery misschien de IDs van de stoel kunnen ophalen, maar hoe kan ik deze vervolgens vergelijken met de gevraagde IDs?
Ik ben een website aan het bouwen waarop men adhv verschillende criteria naar producten kan zoeken. Sommige van deze producten kunnen meerdere criteria tegelijk hebben, vandaar dat ik het nuttig vind een AND/OR optie te voorzien (bijvoorbeeld ik wil een stoel die zowel zwart als wit is tov ik wil zwarte of witte stoelen). Ik zal verder in mijn uitleg conceptueel een stoel als voorbeeld blijven gebruiken.
Voor dit project in kwestie gebruik ik Symfony 3 en de Doctrine 2 querybuilder. Stel ik heb 2 Entities Chair en Color die gemapt zijn aan 3 tabellen chair, chair_has_color en color.
De gebruiker vraagt in zijn zoekopdracht naar 3 kleuren stoelen:
PHP:
1
| $colorIds = array(1, 2, 3); |
Stel dat hij alle stoelen met de opgegeven kleuren wil (OR), kan dit eenvoudig met een IN statement:
PHP:
1
2
3
4
5
6
| $queryBuilder ->select('chair') ->from('Chair', 'chair') ->innerJoin('chair.colors', 'color') ->where($queryBuilder->expr()->in('color.id', ':colorIds')); ->setParameter('colorIds', $colorIds); |
Hoe kan ik een query schrijven zodat de gebruiker een stoel kan opvragen die deze 3 kleuren tesamen heeft (AND)?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $queryBuilder ->select('chair') ->from('Chair', 'chair') ->innerJoin('chair.colors', 'color'); $parameters = array(); foreach ($colorIds as $i => $colorId) { $queryBuilder->andWhere($queryBuilder->expr()->eq('color.id', ':colorId' . $i)); $parameters['colorId' . $i] = $colorId; } $queryBuilder->setParameters($parameters); |
Bovenstaande manier van werken werkt alleszins niet omdat een enkele record niet meer dan 1 ID kan hebben. Ik zou met een subquery misschien de IDs van de stoel kunnen ophalen, maar hoe kan ik deze vervolgens vergelijken met de gevraagde IDs?