1

このモデルから特定の友達を選択する方法を知りたいです。
モデル構造は次のとおりです。

    /**
     * @MongoDB\ReferenceMany(targetDocument="Users", mappedBy="myFriends")
     */
    public $friendsWithMe;

    /**
     * @MongoDB\ReferenceMany(targetDocument="Users", inversedBy="friendsWithMe")
     */
    public $myFriends;

    public function __construct() {
        $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
        $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add friend
     * @param Users $user
     */
    public function addFriend(Users $user) {
        $user->friendsWithMe[] = $this;
        $this->myFriends[] = $user;
    }

    /**
     * Get friends
     * @return Array $myFriends
     */
    public function getFriends() {
        return $this->myFriends;
    }

ユーザーの友達を取得するには、次のコードを使用します。

foreach($userSearch->getFriends() as $friend){
    $output .= "&nbsp;FriendName: " . $friend->getFirstName() . " - ID: " . $friend->getId() . "<br>";
}

したがって、すべての友達を取得してループさせたくない場合、特定のユーザーまたはユーザー(友達)を取得するにはどうすればよいですか?20歳以上としましょう。

編集 済みここでは、コレクションにあるドキュメントを追加しているので、クライアント側のforループではなく、たとえばx歳より古い2人の友人の1人をクエリで取得する方法を探しています。

{
   "_id": ObjectId("503f3028e71a38840d000000"),
   "birthdate": ISODate("2012-08-30T09: 19: 36.0Z"),
   "email": "mail",
   "firstName": "asd",
   "myFriends": {
     "0": {
       "$ref": "Users",
       "$id": ObjectId("503e1683921da8c80b000002"),
       "$db": "testing" 
    },
     "1": {
       "$ref": "Users",
       "$id": ObjectId("503e0a8ee71a38080b000001"),
       "$db": "testing" 
    } 
  },
   "password": "123",
   "role": {
     "$ref": "UserRoles",
     "$id": ObjectId("50486ba1e71a384c15000000"),
     "$db": "testing" 
  },
   "username": "gizmo" 
}

注: ZF2プロジェクト(ZF2 + DoctrineOdmMongodb)のモジュールで使用しています

4

2 に答える 2

4

管理対象ユーザードキュメント$userとのインスタンスがあると仮定しますUserRepository $userRepository

$users = $userRepository->createQueryBuilder()->field('myFriends')->includesReferenceTo($user)->field('age')->gt(20)->getQuery()->execute();
于 2012-09-04T01:34:39.173 に答える
0

フィルタを使用します。

同等のORMについては、http://docs.doctrine-project.org/en/latest/reference/filters.htmlを参照してください。フィルタは数か月前にODMに実装され、DoctrineMongoODMModuleを介して構成できます。

基本的に、フィルタークラスを作成します。DoctrineMongoODMModule構成に行を追加してから、でフィルターをオンにします。$documentManager->getFilterCollection()->enable('myFilter');

フィルタの使用例は、https://github.com/doctrine/mongodb-odm/blob/master/tests/Doctrine/ODM/MongoDB/Tests/Functional/FilterTest.phpにあります。

于 2012-09-04T01:12:24.523 に答える