簡體   English   中英

Symfony 2.2,Doctrine 2:復雜的關系實體檢索

[英]Symfony 2.2, Doctrine 2: Complex relational entity retrieval

背景

我正在投資組合網站,網站相當簡單,大部分工作都在畫廊。 我有一組數據庫表所有鏈接起來以不同的方式檢索和過濾畫廊,從頂部,它如下:

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();

但是,我看到獲取每個圖庫的第一個圖像的唯一方法是循環它們並檢索每個實體。 就像我說的,這似乎是錯的。

唯一的另一個改進我的建議就是使用庫實體中的實體管理器來獲取實體中的圖像,這當然會破壞Doctrine用於的目的。


結論

總之,我該如何做得更好? 必須有一個地方可以做得更好,我只是Symfony的新手。 查看文檔沒有幫助...


額外細節

我忘了提及,仍然能夠使用實體的能力是必要的,我在稍后使用的實體上有一些方法。 例如,在GalleryImage實體中,我有方法來獲取圖像的系統路徑和Web路徑。 我仍然需要能夠使用它們。

你可以做很多事情; 我將列出一個子彈點列表,以便您可以發現它們。

延遲加載會產生額外的查詢; 如果您知道要抽取一組關聯實體,則可能需要加入這些實體。

以下代碼生成兩個查詢

$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();

這只是一個查詢。

如果你有很多畫廊,讓我們說100,000,你的服務器將很快耗盡內存,所以你可能想要使用額外的延遲加載選項分頁或使用延遲加載

如果您想要更多地抽象代碼,可以在存儲庫和控制器之間添加服務。

  • 存儲庫將從數據庫中獲取數據
  • 服務將調用存儲庫,獲取數據並對其進行操作(如Helper類)。
  • 控制器將調用服務並將數據注入模板層(以及其他內容)。

如果要獲取每個庫的第一個圖像,可以使用IN語句和GROUP BY語句創建SELECT查詢。 這樣,您可以對所有圖庫進行一次查詢,而不是“x”查詢(如果有100,000個圖庫,則查詢100,000個查詢)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM