0

私が理解しているように、最適なコード スタイルは、複雑な SQL/DQL クエリをエンティティ リポジトリに配置することです。

たとえば、「ニュース」という名前のエンティティがあります。「NewsRepository」という名前の独自のエンティティ リポジトリがあります。

コントローラーには、次のコードがあります。

/**
 * @Route("/news", name="news")
 */
public function indexAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $paginator = $this->get('knp_paginator');

    $news = $paginator->paginate(
        $em->createQuery('SELECT n FROM AppBundle:News n'),
        $request->query->getInt('page', 1),
        10
    );

    return $this->render('app/news/list.html.twig', array(
        'news' => $news,
    ));
}

ここで、さらに機能を追加したいと思います (フィルタリング、並べ替えなど)。これは、クエリを任意のサービスまたはエンティティ リポジトリに移動する必要があると思うためです。しかし、最適なコーディング スタイルとはどのようなものでしょうか?

(そして、フィルタリングを簡単に追加したり、並べ替えたりするための優れた一般的なアイデアを誰かが持っていますか?)

4

2 に答える 2

1

もちろん、

再度使用する場合は、すべてのリクエストがリポジトリにある必要があります。最も複雑なだけではありません。

あなたの最初の質問に答えてから、「一般的なフィルタリング」に役立つヒントを提供します。

リクエストをレポに入れたい場合は、 NewsRepository で作成するだけです:

public function findAllOrderedByDate() {
    $qb = $this->createQueryBuilder('n');
    $qb->orderBy('creationDate');

    return $qb->getQuery()->getResult();
}

そしてあなたのコントローラーで:

public function indexAction(Request $request)
{
    $newsRepo = $this->get('doctrine')->getRepository('AppBundle:News');
    $em = $this->getDoctrine()->getManager();
    $paginator = $this->get('knp_paginator');

    $news = $newsRepo->findAllOrderedByDate();
    $pagination = $paginator->paginate(
        $news,
        $request->query->getInt('page', 1),
        10
    );

    return $this->render('app/news/list.html.twig', array(
        'news' => $pagination,
    ));
}

フィルタリングの場合、レポートには、直接結果ではなく qb を返すというトリックがあります。

同様に、(addOrderBy()またはを使用してandWhere) 特定のパラメーターで orderBy を追加し、queryBuilder を返す関数を作成することもできます。その後、すべて処理できます。

編集 :


このスレッドで読んだ解決策:

public function findAllOrderedByDate(callable $func = null) {
    $qb = $this->createQueryBuilder('n');
    $qb->orderBy('creationDate');

    if (is_callable($func)) {
        return $func($qb);
    }
    return $qb->getQuery()->getResult();
}

そしてあなたのコントローラーで:

$func = function (QueryBuilder $qb) use ($paginator, $request) {
    return $paginator->paginate($qb, $request->query->getInt('page', 1), 10);
};
$pagination = $em->getRepository('AppBundle:News')->findAllOrderedByDate($func);
于 2015-11-30T08:38:13.940 に答える