3

バックグラウンド

私はポートフォリオのウェブサイトに取り組んでいます。ウェブサイトはかなりシンプルで、作品の大部分はギャラリーにあります。さまざまな方法でギャラリーを取得およびフィルタリングするためにすべてリンクされた一連のデータベーステーブルがあります。上から順に、次のとおりです。

GalleryCategory-> Gallery->GalleryImage


問題

私が直面している問題は、特定のカテゴリのすべてのギャラリーを表示しているギャラリー カテゴリ ページでのみ発生し、その後、ギャラリー内のギャラリー イメージが返されます。

私のコントローラーは現在次のようになっています。

public function galleryCategoryAction($categoryId)
{
    $em = $this->getDoctrine()->getManager();

    $category  = $em->getRepository('SeerUKDWrightGalleryBundle:GalleryCategory')->findById($categoryId);
    $galleries = $category->getGalleries();

    $galleryImages = [ ];
    foreach ($galleries as $i => $gallery)
    {
        $galleryImages[$gallery->getId()] = $em->getRepository('SeerUKDWrightGalleryBundle:GalleryImage')
            ->findOneByGalleryId($gallery->getId());
    }

    return $this->render('SeerUKDWrightGalleryBundle:Gallery:category.html.twig', array(
        'category'      => $category,
        'galleries'     => $galleries,
        'galleryImages' => $galleryImages
    ));
}

今、これが機能している限り、まさに私が望んでいるように、私はそれがちょうど...間違っているように感じます! カテゴリ内のギャラリーを取得することは、素晴らしくクリーンです。

$category  = $em->getRepository('SeerUKDWrightGalleryBundle:GalleryCategory')->findById($categoryId);
$galleries = $category->getGalleries();

しかし、各ギャラリーの最初の画像を取得する唯一の方法は、それらをループして各エンティティを取得することです。私が言ったように、これは間違っているようです。

これを改善するための他の唯一の提案は、ギャラリー エンティティのエンティティ マネージャを使用してエンティティ内の画像を取得することです。


結論

結論として、どうすればこれをより良く行うことができますか?これをもっとうまくやる場所があるに違いありません。私は Symfony の初心者です。ドキュメントを調べても役に立ちませんでした...


追加の詳細

言及するのを忘れていましたが、エンティティを引き続き使用できることが必要です。後で使用されるエンティティに対していくつかのメソッドがあります。たとえば、GalleryImage エンティティには、画像のシステム パスと Web パスを取得するメソッドがあります。私はまだそれらを使用できるようにする必要があります。

4

1 に答える 1

6

できることはたくさんあります。箇条書きのリストを作成して、それらを見つけられるようにします。

遅延読み込みにより、追加のクエリが生成されます。関連付けられたエンティティのコレクションをプルすることがわかっている場合は、おそらくこれらのエンティティに参加する必要があります。

次のコードは、2 つのクエリを生成します

$category  = $em->getRepository('SeerUKDWrightGalleryBundle:GalleryCategory')->findById($categoryId);
$galleries = $category->getGalleries();

ドキュメントに従う場合は、次のことを行う必要があります (できればエンティティのリポジトリ クラスで)

$em = $this->getDoctrine()->getManager();

$query = $em->createQuery(
    'SELECT gc, g
     FROM SeerUKDWrightGalleryBundle:GalleryCategory gc
     LEFT JOIN gc.galleries g
     WHERE gc.id = :categoryId'
)->setParameter('categoryId', $categoryId);

$category = $query->getResult();

クエリは 1 つだけです。

100,000 などの多数のギャラリーがある場合、サーバーはすぐにメモリ不足になるため、ページネーションを行うか、追加の遅延読み込みオプションを使用して遅延読み込みを使用することをお勧めします。

コードをさらに抽象化したい場合は、リポジトリとコントローラーの間にサービスを追加できます。

  • リポジトリはデータベースからデータを取得します
  • サービスはリポジトリを呼び出し、データを取得して操作します (ヘルパー クラスのように)。
  • コントローラーはサービスを呼び出し、テンプレート レイヤーにデータを挿入します (とりわけ)。

各ギャラリーの最初の画像を取得する場合は、ステートメントとステートメントを使用してSELECTクエリを作成できます。そうすれば、「x」クエリではなく、すべてのギャラリーに対して 1 つのクエリを実行できます (100,000 のギャラリーがある場合は 100,000 のクエリ)。INGROUP BY

于 2013-03-22T20:49:49.350 に答える