简体   繁体   English

Doctrine ODM / PHP / MongoDB - 无法查询引用元素

[英]Doctrine ODM / PHP / MongoDB - Can't query Referenced Elements

I have an Event, that has a Privilege and this Privilege references a User. 我有一个具有权限的事件,此权限引用用户。 I'm trying to get all the events associated with a User, but I can't seem to get doctrine working as I'd like. 我正在尝试获取与用户相关的所有事件,但我似乎无法按照我的意愿获得教义。

Here is my Mongo Schema 这是我的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
)

The doctrine Event Entity: 学说事件实体:

class Event {

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

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

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

The Privilege Entity: 特权实体:

class Privilege {

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

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

And the User entity: 和用户实体:

class User {

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

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

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

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

I tried the following with no success 我尝试了以下但没有成功

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

I have also tried using the Event class but it doesn't get more success... I'm surely missing something but I have no clue what! 我也试过使用Event类,但它没有取得更大的成功......我肯定错过了一些东西,但我不知道是什么! Any help is welcome. 欢迎任何帮助。

Thanks. 谢谢。

** One night later ** Finally got it working! **一天晚上**终于搞定了!

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

You really need to use the new MongoId() otherwise it always returns empty! 你真的需要使用新的MongoId(),否则它总是返回空!

you can try this: 你可以试试这个:

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

strangely it's not documented here http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html , but worked for me. 奇怪的是,这里没有记录http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html ,但为我工作。

quick note while the method works you won't be using an index when using the .$id reference. 快速注释,当方法有效时,使用。$ id引用时不会使用索引。

It is best to use the db reference. 最好使用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

I assumed user is the name of the collection above and database_name as database name. 我假设user是上面集合的名称,database_name是数据库名称。 You can also create the index by : 您还可以通过以下方式创建索引:

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

When you have very large collections with multiple shards and replica sets the index will come in handy. 当您拥有包含多个分片和副本集的非常大的集合时,索引将派上用场。

user.id的结果是什么?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM