2

ユーザー(User)と友情リクエスト()を表す2つのエンティティがありますFriendshipRequest。UserとFriendshipRequestの間にはoneToManyの関係があるため、DoctrineはgetFriendshipRequests()クラスUserで呼び出されるメソッドを作成します。これは問題ありませんが、FriendshipRequestにはstatusという属性があるため、Userクラスに関連付けられているフレンドシップリクエストをフィルタリングして、ステータスに参加させたいと思います。Doctrineのドキュメントを読みましたが、次のことがわかりました。

ネイティブでは、2.0および2.1では関連付けをフィルタリングできません。フィルタリングされたエンティティのセットをクエリするには、DQLクエリを使用する必要があります。

これによると、FriendshipRequestリポジトリを作成し、「findByStatusAndUser」(またはそのようなもの)というメソッドを作成する必要があると思いますが、それはくだらない解決策だと思います。

Userエンティティに。のようなメソッドが必要getPendingStatusRequests()です。これは可能ですか?そうでない場合、最善の解決策は何でしょうか?

4

3 に答える 3

2

Doctrine 2.3以降、マッチングと基準を使用できます。次に、ユーザーエンティティで必要に
応じて使用できます。getPendingStatusRequests()あなたの例では、コードは次のようになります。

public function getPendingStatusRequests()
{
    $criteria = Criteria::create(); //don't forget to use Doctrine\Common\Collections\Criteria;
    $criteria->where(Criteria::expr()->eq('status', 1));

    return $this->friendshipRequests->matching($criteria);
}
于 2016-02-07T10:08:00.260 に答える
1

FriendshipRequestリポジトリの"getPendingRequestsForUser($ user)"メソッドが良い解決策になると思います。このメソッド内で、適切なDQLを作成する必要があります。

すべてのロジックをリポジトリに移動し、エンティティを可能な限り小さくクリーンな状態にしておく必要があるため、これは優れたソリューションです。

UPD:また、ここで説明するように、findByメソッドを使用することもできます。例:

$pendingRequests = $em->getRepository('MyBundle:FriendshipRequest')->findBy(
    array('user' => $user->getId(), 'status' => 1)
);

しかし、私にとっては、最初の方法が好まれます。

于 2012-08-03T11:12:40.860 に答える
0

確かにgetPendingStatusRequests()をユーザーに追加してから、すべての友情リクエストを循環させ、適切なステータスのリクエストのみを返すことができます。

唯一の潜在的な問題は、不要なものも含めて、すべての友情リクエストが常に読み込まれることです。これが本当の問題であるかどうかを決めるのはあなた次第です。友情リクエストが処理されると削除されるため、ユーザーはいつでも多くのリクエストを受け取ることができなくなります。

すべてのリクエストのロードを回避したい場合は、クエリを実行し、join句でWITH式を使用します。何かのようなもの:

$qb->leftJoin('user.friendshipRequests','request', 
        Expr\Join::WITH, $qb->expr()->eq('request.status', $qb->expr()->literal('Pending')));

そして、あなたはS2を使用しているので、私はリポジトリをいじくり回しません。UserManagerというサービスを作成し、エンティティマネージャーを挿入して、loadUserWithPendingFriendshipRequestsというメソッドを指定するだけです。

于 2012-08-03T13:45:00.620 に答える