php - MongoDB/doctrine: no se puede anidar $ o $ y
doctrine-odm (2)
Parece que necesita construir una subconsulta por separado antes de agregarla a $q
.
$q->addAnd(...)
se evalúa inmediatamente y se agrega a $q
, pero desea que espere.
No tengo este paquete instalado, así que no puedo probar, pero esto es solo una corazonada. Espero eso ayude.
$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();
Tengo problemas para anidar operaciones $or
operaciones de dos operadores múltiples dentro de una operación $and
. La conclusión de esta discusión suena similar a lo que necesito, pero no puedo hacer que funcione. Aquí está el JavaScript de lo que trato de hacer:
db.Business.find(
{
$and:
[
{ $or: [{nm: /American/}, {dsc: /American/}] },
{ $or: [{nm: /Mega/}, {dsc: /Mega/}] }
]
}
)
Eso funciona en el shell interactivo de MongoDB.
Y aquí hay algo de PHP que me parece bien pero que no funciona (causa recursión infinita donde se indica):
$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();
¿Algunas ideas?
Puedes intentar lo siguiente:
$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();