2012-04-11 29 views
5

Mam problemy wielokrotne zagnieżdżanie dwóch operandów $or operacje w ramach działania $and. Podsumowanie this discussion brzmi podobnie, czego potrzebuję, ale nie mogę go uruchomić. Oto JavaScript tego, co próbuję wykonać:

db.Business.find(
    { 
    $and: 
     [ 
     { $or: [{nm: /American/}, {dsc: /American/}] }, 
     { $or: [{nm: /Mega/}, {dsc: /Mega/}] } 
     ] 
    } 
) 

Działa to w powłoce interaktywnej MongoDB.

A oto niektóre PHP, który wygląda ok do mnie, ale nie działa (powoduje nieskończoną rekurencję gdzie wskazane):

$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(); 

jakieś pomysły?

Crossposted here.

Odpowiedz

10

Wygląda na to, że należy utworzyć oddzielne podzapytanie przed dodaniem go do $q.

$q->addAnd(...) jest oceniany od razu i dodaje się do $q, ale chcesz go poczekać.

Nie mam tego pakietu zainstalowanego, więc nie mogę przetestować, ale to tylko przeczucie. Mam nadzieję, że to pomoże.

$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(); 
+0

To było to dokładnie! Dziękuję Ci! Dodanie '-> expr()' rzeczywiście opóźnia dodawanie wyrażenia "$ lub" do odpowiedniego czasu. –

0

Można spróbować następująco:

$filters = array(
    new \MongoRegex('/American/i'), 
    new \MongoRegex('/Mega/i') 
); 
$q = $doctrineOdm->createQueryBuilder('Business') 
       -> field('nm') ->in($filters) 
       -> field('dsc') ->in($filters); 

print_r($q->getQuery()->getQuery()); // infinite recursion 
$cursor = $q->getQuery()->execute();