2012-04-11 15 views
5

मैं मुसीबत घोंसला बनाने से कई दो संकार्य एक $and आपरेशन के भीतर $or संचालन हो रही है। this discussion का निष्कर्ष मुझे वही लगता है जो मुझे चाहिए, लेकिन मैं इसे काम करने में असमर्थ हूं। यहां मैं जो करने की कोशिश कर रहा हूं उसका जावास्क्रिप्ट यहां है:

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

यह मोंगोडीबी इंटरैक्टिव शैल में काम करता है।

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

कोई भी विचार:

और यहाँ कुछ पीएचपी कि मुझे ठीक लग रहा है लेकिन काम नहीं करता है (अनंत प्रत्यावर्तन जहां संकेत दिया कारण बनता है) है?

Crossposted here

उत्तर

10

ऐसा लगता है कि इसे $q पर जोड़ने से पहले आपको एक अलग सबक्वायरी बनाने की आवश्यकता है।

$q->addAnd(...) का मूल्यांकन तुरंत किया जाता है और खुद को $q पर जोड़ता है, लेकिन आप इसे प्रतीक्षा करना चाहते हैं।

मेरे पास यह पैकेज स्थापित नहीं है इसलिए मैं परीक्षण नहीं कर सकता, लेकिन यह सिर्फ एक झटका है। आशा करता हूँ की ये काम करेगा।

$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

कि यह वास्तव में था! धन्यवाद! '-> expr()' जोड़ना वास्तव में उचित समय तक '$ या' अभिव्यक्ति जोड़ना देरी करता है। –

0

इस प्रकार आप की कोशिश कर सकते हैं:

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