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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top