2012-04-11 27 views
5
içinde yuvalayamıyorum

Bir $and işleminde birden çok iki işlenen $or işlem yuvalama sorun yaşıyorum. this discussion'un sonucu, ihtiyacım olana benzer geliyor ama işe yaramadı. Yapmaya çalıştığım şeyin JavaScript'i:

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

Bu, MongoDB etkileşimli kabuğunda çalışır.

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

Herhangi bir fikir: Burada

Ve

bana Tamam görünüyor ama çalışmıyor bazı PHP (belirtilen sonsuz özyinelemeye neden olur) var?

Crossposted here.

cevap

10

$q ürününe eklemeden önce ayrı bir alt sorgu oluşturmanız gerektiği anlaşılıyor.

$q->addAnd(...) hemen değerlendirilir ve kendini $q'a ekler, ancak beklemesini istersiniz.

Bu paket yüklü değil, bu yüzden test edemiyorum, ama bu sadece bir önsezidir. Umarım yardımcı olur.

$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

tam oldu! Teşekkür ederim! '-> expr()' ifadesi eklendiğinde, "$ or" ifadesi uygun zamana kadar eklenir. –

0
aşağıdaki şekilde deneyebilirsiniz

: it

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