Tüm haber ve tüm yorumlar getir

3 Cevap php

I'm trying to code a query that gets all the news and all the comments for each news. My current query is :

SELECT n.*,
       c.* AS comments
  FROM news n
       JOIN comments c ON (c.news_id = n.id)

Ben bir dizi olarak sorgu getir zaman ama bana Yorumlarınız tarafından bir anahtar verir ve ben bir alt-dizide haberlerden bir anahtarı ve tüm yorumlarınız istiyorum.

Gibi bir şey:

Array
(
    [0] => Array
    (
        [id] => 1 // news' id
        ...       // rest of news' data
        [comments] = Array
        (
            [id] => 1 // comment's id
            ...       // rest of comments' data
        )
    ),
    ... // all other news
)

Teşekkürler!

3 Cevap

Bir sorguda bunu yapamam - en ihtiyacınız veri yapısını almak için var sorgu ve işlem sonrası oluşabilecek cevap almak için.

Daha fazla ayrıntı için - bir sütun için boyut ve eşleşen satırlar için bir - herhangi bir SQL sorgusu sadece verilerin iki boyutlu bir dizi dönebilirsiniz. Sizin durumunuzda ne sonra aslında konum daha üç boyutlu bir tablo gibi.

Yazılan her yazıda karşı her Yorumlarınız için tekrar tekrar news tüm verilerin dönecektir aynı zamanda sizin sorguyu unutmayın. Bu veritabanı sunucusu bant genişliği ve kaynak kullanımı açısından verimsiz bir bulunuyor.

Bu (pseudo-code) gibi bunu yapmak için muhtemelen daha verimli:

SELECT * FROM news
...
foreach ($rows as $row) {
  $row['comments] = array();
  $news[$row['id']] = $row;
}

SELECT * FROM comments
...
foreach ($rows as $row) {
  $news[$row['news_id']]['comments'][] = $row;
}

İlk sorgu haberlerin tüm alır ve onları bir diziye koyar. İkinci sorgu yorumlar alır ve her haber eşyanın yapısı içinde ayrı bir dizi birikir.

Ben bireysel kayıtları olup veri yapıları dönen varsayarak yaşıyorum. Sen datastructure içine bu kayıtları grubuna kendinizi ihtiyacımız olacak. Ben, eğer mümkünse bazı örnek kod için dışarı yapacağını ama bu doğrudan SQL aracılığıyla yapılabilir yapılamaz. (Ya DB doğrudan PHP geri alamadım gibi)

Eğer ORM her türlü kullanıyor musunuz? Sen bakarak düşünebilirsiniz:

  • PHP 5.1 için Rocks, Açık Kaynak ORM artı, özgür yazılım (GNU LGPL)
  • Doctrine, Açık Kaynak ORM PHP 5.2.3 için, özgür yazılım (GNU LGPL)
  • Apache Tork, özgür yazılım (GNU LGPL) esinlenerek PHP 5 için Propel, ORM ve Sorgu-Toolkit,
  • PHP için EZPDO, Açık Kaynak ORM 5.0.4 veya daha yeni, özgür yazılım (BSD)
  • Yüklemek için uskur ama kolay esinlenerek DABL, Veritabanı sınıf yaratıcısı ve Query Builder, özgür yazılım
  • Data Shuffler Data mapper uygulama (Yeni BSD)
  • PHP için Outlet Açık kaynak ORM (beta) 5.1.6 veya daha yeni, Hazırda benzer bir yaklaşım kullanır (Yeni BSD)
  • PHP5 için Coughphp Açık kaynak ORM, kod üretimi kullanır (Bu, diğer veritabanı sürücüleri bağlamak mümkün olmalıdır, ama kutudan sadece MySQL desteği dahil edilmiştir. [1]) (FreeBSD)

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

Eğer iç, tek bir sorguda neden almak için katılabilir kullanabilirsiniz.

Veritabanı yapısı gibi olduğunu düşünelim:

tab_news: news_id, haber

tab_cmt: cmt_id, news_id, cmt

Şimdi gibi sorgu yazmak:

tab_news gelen n.news, c.cmt seçmek n iç üzerinde tab_cmt c join (c.news_id = n.news_id)