Doctrine ODM / PHP / MONGODB-参照される要素を照会できません
-
22-10-2019 - |
質問
私には特権があり、この特権がユーザーを参照しているイベントがあります。ユーザーに関連付けられたすべてのイベントを取得しようとしていますが、私が望むように教義を機能させることはできないようです。
これが私のマンゴスキーマです
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
また、イベントクラスを使用してみましたが、それ以上の成功はありません...確かに何かが欠けていますが、何がわかりません!どんな助けも大歓迎です。
ありがとう。
解決
** 1晩後**ついに機能しました!
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()を使用する必要があります。そうしないと、常に空に戻ります!
他のヒント
あなたはこれを試すことができます:
$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, 、しかし私のために働いた。
の結果 ユーザーID?
$qb2 = $privilege_repository->createQueryBuilder('\Event\Privilege') ->field('user.id')->equals(new \MongoId('4e63611cbc347053a2000001'));
クイックノートメソッドが機能している間、。$ idリファレンスを使用する場合、インデックスを使用することはありません。
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
ユーザーは、上記のコレクションの名前とデータベース名としてデータベース_NAMEの名前であると思いました。次のインデックスを作成することもできます。
db.collection.ensureIndex({'privileges.user':1};
複数のシャードとレプリカセットを備えた非常に大きなコレクションがある場合、インデックスは役に立ちます。
所属していません StackOverflow