Symfony'de uskur ile bir tarihi tablo üzerinden 3 tablolardan kayıtları döndürme

4 Cevap php

Ben 3 veritabanı tabloları var:

  • makale
  • makale_has_etiket (2 FK's to the other tables)
  • etiket

Şu anda altında gösterilen makalenin etiketleri ile makalelerinin bir listesini gösterir, ancak liste uzadıkça sorgu sayısı artıyor.

Ben tüm makaleleri üzerinde döngü istiyorum ve sırayla her birinden etiket nesneleri almak.

O 1 propel sorguda yapılabilir mi?

4 Cevap

Ben zaten yorum olarak açıklanan yöntemler, alternatif yöntemleri hakkında konuşmak iken, en azından sorunu çözmek için doğrudan bir yol yoktur ... Symfony 1.0 kullanılarak ve dolayısıyla 1.2 uskur inanıyoruz: senin {[(0)] için bu işlev eklemek } class:

  public static function getTaggedArticles()
  {
    $c = new Criteria();
    //some filters here, e.g. LIMIT or Criteria::IN array
    $ahts = ArticleHasTagPeer::doSelectJoinAll($c);

    $articles = array();
    foreach($ahts as $aht)
    {
      if(!isset($articles[$aht->getArticleId()]))
      {
        $articles[$aht->getArticleId()] = $aht->getArticle();
      }

      $articles[$aht->getArticleId()]->addTag($aht->getTag());
    }

    return $articles;
  }

$ahts için kısa olduğu $article_has_tags. Onlar zaten bu kolaylaştırmak için var yoksa (protected array $collTags) addTag() yöntemi ile birlikte Article sınıfta etiketleri basit bir dizi oluşturun.

Bu daha sonra sadece tek bir SQL sorgusu çalıştırır, ama potansiyel olarak gereksiz nesnelerin yüzlerce nemlendirici bahsetmek filtre olmadan ciddi düşünün, ve bu önemli bir performans isabet. Yalnızca doSelectRS () çağrısı üzerine dayalı nemlendirmek için nasıl araştırma isteyebilirsiniz - onların JOIN yöntemler işe nasıl için BlahPeer sınıfları incelemek, ve sonra this link özel {[yazmak için nasıl (0)]} yöntemleri.

Her iki şekilde de, yöntem anahtar olarak articleID ile makaleleri eşsiz bir dizi oluşturur - farklı bir sıralama düzeni gerekiyorsa, yine bu diziyi sıralamak ya da bunu oluşturmak gibi koleksiyonunuzu organize etmek için farklı bir dizi tuşunu kullanabilirsiniz.

Sorunuzu yanlış anlama ediyorum sürece, farklı bir tür kabartmak oluşturmak olacak gibi, bir şey üzerinde döngü yok.

"Yazı" "article_has_tag" için birleştirilmiş tek bir sorgu yapmak "tag" birleştirilir. Tek bir sorgu sahip oldukları etiketleri için belirtilen makaleler ve etiket isimleri iade edilmelidir.

Kendimi bu yüzden tam sorgu ile size yardımcı olamaz Doktrini kullanabilirsiniz ama Googling bu gibi şeyler getiriyor: http://www.tech-recipes.com/rx/2924/symfony_propel_how_to_left_join/.

Ayrıca, (uskur için yazılmıştır) symfony kesin kılavuz size yardımcı olmalıdır.

Ikincisi olduğu gibi ben bu çoklu için a very natural support, sen Propel 1.3 veya 1.4 kullanan ve henüz (hala beta olduğu) 1.5 uskur değildir varsayalım (Doktrini sözdizimi tarafından, kısmen, ilham) katıldı.

Eğer veritabanı şeması, yabancı anahtarları tanımlanmış ise, ArticleHasTagPeer sınıfında statik doSelectJoinByAll yöntem olmalıdır. Bu yöntemi kullanırsanız, ilgili Article ve Tag nesneleri aynı sorgu ile sulu olacaktır. Hala Article ve Tag seçim kriterlerini değiştiren bir Criteria nesnesi iletebilirsiniz. Ben muhtemelen Madde nesnelerden başlamak istiyorum çünkü bu, biraz garip olduğunu biliyorum, ve bu uskur 1.5 değişim için itici faktörlerden biriydi. Symfony olarak da DbFinderPlugin, bu zaten (o a small patch uskur 1.4 gerekiyor) uskur 1.3 size bu yeteneği verecek kullanabilirsiniz. Aslında, uskur 1.5 çoğunlukla François Zaniotto, DbFinderPlugin yazarı tarafından yazılmıştır.

Kısa cevap no.

Ancak bazı çabaları ile hala bunu yapabilirsiniz. İşte seçenekler listesi:

  1. Kullan dbFinderPlugin eklentisi
  2. (Diyelim ki, doSelectPostWithUsersAndComments), kendi akran yöntem yazın.
  3. 1,5 uskur için göç
  4. Doktrini göç