Frage

Ich habe ein Ereignis, das ein Privileg hat und dieses Privileg auf einen Benutzer verweist. Ich versuche, alle Ereignisse mit einem Benutzer verknüpft zu machen, aber ich kann nicht anscheinend die Lehre zum Laufen bringen, wie ich es mir wünscht.

Hier ist mein Mongo -Schema

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
)

Die Lehre Event -Entität:

class Event {

    /**
     * @Id
     */
    protected $id;

    /**
     * @String
     */
    protected $name;

    /**
     * @EmbedMany(targetDocument="\Event\Privilege")
     */
    protected $privileges = array();
}

Die Privilegieneinheit:

class Privilege {

    /**
     * @ReferenceOne(targetDocument="\User", cascade={"persist"})
     */
    protected $user;

    /**
     * @String
     */
    protected $role;
}

Und die Benutzerentität:

class User {

    /**
     * @Id
     */
    protected $id;

    /**
     * @String
     */
    private $firstname;

    /**
     * @String
     */
    private $lastname;

    /**
     * @String
     */
    protected $username;
}

Ich habe Folgendes ohne Erfolg ausprobiert

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

Ich habe auch versucht, die Event -Klasse zu verwenden, aber es wird nicht mehr Erfolg ... mir fehlt mir sicher etwas, aber ich habe keine Ahnung was! Jede Hilfe ist willkommen.

Vielen Dank.

War es hilfreich?

Lösung

** Eine Nacht später ** endlich zum Laufen!

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

Sie müssen wirklich den neuen Mongoid () verwenden, da es sonst immer leer zurückkehrt!

Andere Tipps

Sie können dies versuchen:

$user = ... The User Document with _id 4e63611cbc347053a2000001 ...
$dm = $this->getDocumentManager();
$queryBuilder = $dm->createQueryBuilder('\Event')->field('privileges.user')->references($user)

Seltsamerweise ist es hier nicht dokumentiert http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html, aber für mich gearbeitet.

Was das Ergebnis aus Benutzeridentifikation?

$qb2 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user.id')->equals(new \MongoId('4e63611cbc347053a2000001'));

Kurzer Hinweis Während die Methode funktioniert, verwenden Sie keinen Index, wenn Sie die $ ID -Referenz verwenden.

Es ist am besten, die DB -Referenz zu verwenden.

$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

Ich nahm an, dass der Benutzer der Name der Erfassung oben und als Datenbankname als Datenbankname ist. Sie können den Index auch erstellen nach:

db.collection.ensureIndex({'privileges.user':1};

Wenn Sie sehr große Sammlungen mit mehreren Scherben und Replikaten haben, wird der Index nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top