Doctrine ODM / PHP / MongoDB - не может запрашивать ссылочные элементы - PullRequest
3 голосов
/ 04 сентября 2011

У меня есть событие, которое имеет привилегию, и эта привилегия ссылается на пользователя.Я пытаюсь получить все события, связанные с пользователем, но не могу заставить доктрину работать так, как мне хотелось бы.

Вот моя схема Монго

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
)

Объект события доктрина:

class Event {

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

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

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

Объект привилегий:

class Privilege {

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

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

И объект пользователя:

class User {

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

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

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

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

Я попытался выполнить следующее безуспешно

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

Я также пытался использовать класс Event, но он не добился большего успеха ... Я наверняка что-то упустил, но понятия не имею, что!Любая помощь приветствуется.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 05 сентября 2011

** Однажды ночью ** Наконец-то все заработало!

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

Вам действительно нужно использовать новый MongoId (), иначе он всегда будет пустым!

2 голосов
/ 12 марта 2014

Вы можете попробовать это:

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

странно, что здесь не документировано http://doctrine -mongodb-odm.readthedocs.org / en / latest / reference / query-builder-api.html , но у меня сработало.

0 голосов
/ 12 июля 2013

быстрое примечание, пока метод работает, вы не будете использовать индекс при использовании ссылки. $ Id.

Лучше всего использовать ссылку на базу данных.

$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

Я предположил, что user - это имя коллекции выше, а database_name в качестве имени базы данных.Вы также можете создать индекс следующим образом:

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

Если у вас очень большие коллекции с несколькими шардами и наборами реплик, индекс пригодится.

0 голосов
/ 04 сентября 2011

Каков результат user.id ?

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