Doctrina ODM / PHP / MongoDB - No se puede consultar elementos referenciados
-
22-10-2019 - |
Pregunta
Tengo un evento, que tiene un privilegio y este privilegio hace referencia a un usuario. Estoy tratando de obtener todos los eventos asociados con un usuario, pero parece que no puedo hacer que la doctrina funcione como me gustaría.
Aquí está mi esquema Mongo
Array
(
[_id] => 4e63903cbc3470a2cd000002
[date] => 2011-10-09
[name] => Event1
[privileges] => Array
(
[0] => Array
(
[user] => Array
(
[$ref] => users
[$id] => 4e63611cbc347053a2000001
[$db] => eventdb
)
[role] => admin
)
)
[url] => Event1
)
La entidad del evento de doctrina:
class Event {
/**
* @Id
*/
protected $id;
/**
* @String
*/
protected $name;
/**
* @EmbedMany(targetDocument="\Event\Privilege")
*/
protected $privileges = array();
}
La entidad privilegiada:
class Privilege {
/**
* @ReferenceOne(targetDocument="\User", cascade={"persist"})
*/
protected $user;
/**
* @String
*/
protected $role;
}
Y la entidad de usuario:
class User {
/**
* @Id
*/
protected $id;
/**
* @String
*/
private $firstname;
/**
* @String
*/
private $lastname;
/**
* @String
*/
protected $username;
}
Intenté lo siguiente sin éxito
Example 1:
$privilege_repository = $dm->getRepository('\Event\Privilege');
$qb1 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user.$id')->equals('4e63611cbc347053a2000001');
$query1 = $qb1->getQuery();
$result1 = $query1->execute();
$result1->count() :0
Example 2:
$privilege_repository = $dm->getRepository('\Event\Privilege');
$qb2 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user.$id')->equals(new \MongoId('4e63611cbc347053a2000001'));
$query2 = $qb2->getQuery();
$result2 = $query2->execute();
$result2->count() :0
Example 3:
$privilege_repository = $dm->getRepository('\Event\Privilege');
$qb3 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user')->equals(new \MongoId('4e63611cbc347053a2000001'));
$query3 = $qb3->getQuery();
$result3 = $query2->execute();
$result3->count() :0
También he intentado usar la clase de eventos, pero no tiene más éxito ... Seguramente me estoy perdiendo algo, ¡pero no tengo idea de qué! Cualquier ayuda es bienvenida.
Gracias.
Solución
** Una noche después ** ¡Finalmente lo hice funcionar!
Example 2:
$privilege_repository = $dm->getRepository('\Event');
$qb2 = $privilege_repository->createQueryBuilder('\Event') ->field('privileges.user.$id')->equals(new \MongoId('4e63611cbc347053a2000001'));
$query2 = $qb2->getQuery();
$result2 = $query2->execute();
$result2->count() :3
¡Realmente necesitas usar el nuevo Mongoid () de lo contrario, siempre regresa vacío!
Otros consejos
Puedes probar esto:
$user = ... The User Document with _id 4e63611cbc347053a2000001 ...
$dm = $this->getDocumentManager();
$queryBuilder = $dm->createQueryBuilder('\Event')->field('privileges.user')->references($user)
extrañamente no está documentado aquí http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/Query-builder-api.html, pero funcionó para mí.
¿Qué resultado de usuario.id?
$qb2 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user.id')->equals(new \MongoId('4e63611cbc347053a2000001'));
Nota rápida Mientras el método funciona, no usará un índice cuando use la referencia. $ ID.
Es mejor usar la referencia de DB.
$privilege_repository = $dm->getRepository('\Event');
$qb2 = $privilege_repository->createQueryBuilder('\Event') ->field('privileges.user')->equals( \MongoDBRef::create("user", new \MongoId('4e63611cbc347053a2000001'),'database_name') );
$query2 = $qb2->getQuery();
$result2 = $query2->execute();
$result2->count() :3
Supuse que el usuario es el nombre de la colección anterior y la base de datos_name como nombre de la base de datos. También puede crear el índice por:
db.collection.ensureIndex({'privileges.user':1};
Cuando tenga colecciones muy grandes con múltiples fragmentos y conjuntos de réplicas, el índice será útil.