2011-09-01 5 views
8

私は次のクエリを持っている:私はモチベーションのオブジェクトを制限したいDoctrine2の関連エンティティ結果をどのように制限できますか?

$query = $this->getEntityManager()->createQuery(' 
         SELECT u, p, m 
         FROM MyCoreBundle:User u 
         JOIN u.programmes p 
         JOIN u.motivation m 
         '); 

$result = $query->getResult(); 

は、私は(動機リポジトリに)他の場所で使用しています。この2番目のクエリの結果であることをユーザーごとに返さ:

$query = $this->getEntityManager()->createQuery(' 
         SELECT m FROM MyCoreBundle:Motivation m 
         WHERE m.user = :user 
         ORDER BY m.date DESC'); 

$query->setParameter('user',$user); 
$query->setFirstResult(0); 
$query->setMaxResults(1); 
//@TODO if there is not result recorded for the user, return sth which indicates this 
return $query->getResult(); 

最初のクエリまたはより良いアプローチで動機付けを制限し制限する方法はありますか?

+1

を参照してください、それは次のようになります可能な解決法は 'User:LatestMotivation' OneToOne関連性を作成することです。そして、新しい 'Motivation'エンティティが追加されるたびに(Doctrine' prePersist'イベント経由で)、新しく追加されたもので 'LatestMotivation'が更新されます。この方法で、最新の動機を取得する多くの 'User'レコードを繰り返し処理することができます。 HTH –

答えて

14

ジョイント行の数を制限することはできません。あなたは、コレクションに->slice()を使用することができ教義2.1をお持ちの場合は

$collection = $user->getMotivations(); // returns a LazyCollection, 
              // makes no SQL query 

$motivations = $collection->slice(0, 20); // queries the first 20 motivations 
              // for this user (if the association 
              // was not fetch-joint) 

は以下の書か考えると、「最新のmotiviationは」あなたのために最も重要であると仮定しhttp://www.doctrine-project.org/docs/orm/2.0/en/tutorials/extra-lazy-associations.html

+0

ありがとう - 私は、ユーザーのエンティティにただ一つのモチベーションエントリを追加し、オブジェクトをループし、$ motivationプロパティを上書きする別のメソッドを追加することで、丸めました。汚いですが動作します。 – codecowboy

+2

@ amaud576875 Slotメソッドは、現在のユーザーの関連付けのみを初期化します。複数のユーザーにループすると、複数のクエリが生成されます。すべてのユーザーにスライスされたコレクションを取得する方法はありますか? –

+1

@PetrPeller私は同様の問題があります。あなたはそれを解決できましたか? – svlada

関連する問題