2

symfony2 を使用していますが、それは単に mysql の問題です...

私は良いテーブルスキーマ(重要なフィールドだけ)を持っていると思います(コードは自明です):

ユーザー (id) ステータス (id) いいね (id,user_id,status_id) コメント (id,user_id,status_id)

私は大きな選択をしています。

これを試していました:

    $qb=$this->createQueryBuilder('s')
             ->addSelect('u')
             ->addSelect('u2')
             ->addSelect('u3')
             ->addSelect('l')
             ->addSelect('c')
             ->addSelect('s2')
             ->where('s.user = :user')
             ->setParameter('user', $user)
             ->innerJoin('s.user', 'u')
             ->leftJoin('s.likes', 'l')
             ->leftJoin('l.user', 'u2')
             ->leftJoin('s.comments', 'c')
             ->leftJoin('c.user', 'u3')
             ->leftJoin('c.status', 's2')
             ->orderBy('s.time', 'DESC')
             ->setMaxResults(15);

しかし、結果は 15 の同じステータスです... 間違っています。

ステータスだけを選択していたときにうまく機能しました...ステータスへのいいね..とユーザー(いいねとステータスの作成者)

そのように:

SELECT * FROM statuses s0_ 
INNER JOIN users t1_ ON s0_.user_id = t1_.id 
LEFT JOIN status_likes s2_ ON s0_.id = s2_.status_id
INNER JOIN users t3_ ON s2_.user_id = t3_.id  

WHERE s0_.user_id = 25 ORDER BY s0_.time DESC LIMIT 15

それは非常にうまく機能しますが、どうすれば別のコメントを実装し、(ユーザー -> コメントの作成者) そこを選択できますか?...

4

1 に答える 1

1

試みている方法で、結合されたクエリに最大の結果を設定することはできません。

ここで説明されているように、ページネーターを使用する必要があります: http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

Doctrine のバージョン (2.2 より前) で利用できない場合は、ここでページネーターを使用できます: https://github.com/beberlei/DoctrineExtensions

別のオプションは、クエリで結合を実行せず、結合されたデータを自動的に取得できるようにすることです。したがって、ユーザーを反復処理し、オブジェクト グラフをトラバースして、必要な情報を取得します。これにより、明らかにより多くのクエリが発行されます。

$users = $userRepository->findById($user);
$i = 0;
for ($users as $user){
    $likes = $user->getLikes(); 
    $comments = $user->getComments();
    $i++;
    if ($i == 15) { break; }
}

編集:「続行」を「中断」に変更しました。とにかく、これはくだらないコードです - 使用しないでください。代替案を示しているだけです。

最後に、ネイティブ クエリを使用してこれを実行できます。

http://docs.doctrine-project.org/en/2.1/reference/native-sql.html

編集: 同様の質問:フェッチ結合されたコレクションで教義クエリを制限しますか?

于 2013-03-29T00:27:46.050 に答える