MongoDB/doctrine: can't nest $or in $and
doctrine, doctrine-odm, mongodb, php
Solution
It sounds like you need to build a separate subquery before adding it to `$q`.
`$q->addAnd(...)` is evaluated immediately and adds itself to `$q`, but you want it to wait.
I don't have this package installed so I can't test, but this is just a hunch. Hope it helps.
$q = $doctrineOdm->createQueryBuilder('Business');
foreach (array('American','Mega') as $keyword) {
$r = new \MongoRegex('/'.$keyword.'/i');
$q->addAnd(
$q->expr()->addOr($q->expr()->field('nm')->equals($r))
->addOr($q->expr()->field('dsc')->equals($r))
);
}
print_r($q->getQuery()->getQuery()); // infinite recursion
$cursor = $q->getQuery()->execute();
Problem
I'm having trouble nesting multiple two-operand `$or` operations within an `$and` operation. The conclusion of this discussion sounds similar what I need, but I'm unable to get it to work. Here's JavaScript of what I'm trying to do: ``` db.Business.find( { $and: [ { $or: [{nm: /American/}, {dsc: /American/}] }, { $or: [{nm: /Mega/}, {dsc: /Mega/}] } ] } ) ``` That works in the MongoDB interactive shell. And here's some PHP that looks ok to me but doesn't work (causes infinite recursion where indicated): ``` $q = $doctrineOdm->createQueryBuilder('Business'); foreach (array('American','Mega') as $keyword) { $r = new \MongoRegex('/'.$keyword.'/i'); $q->addAnd( $q->addOr($q->expr()->field('nm')->equals($r)) ->addOr($q->expr()->field('dsc')->equals($r)) ); } print_r($q->getQuery()->getQuery()); // infinite recursion $cursor = $q->getQuery()->execute(); ``` Any ideas? Crossposted here.