it-swarm-id.com

Bagaimana saya bisa memilih ID kategori dan semua subkategori (level)?

Di samping kategori induk, saya ingin secara rekursif mengumpulkan semua baris anaknya.

(Kode semu) SELECT IDs FROM #_categories WHERE parent = father

Sebagai alternatif, SELECT IDs WHERE the first part of path is the parent's path.

Apakah ini benar? Apa cara yang paling efisien?

Bahkan lebih baik:

Apakah ada metode standar (mungkin dalam ContentModelCategories) untuk mencapai apa yang saya butuhkan? Haruskah saya menggunakan ContentModelCategories::getItems(true)? Bagaimana saya memintanya, mengingat saya sudah memiliki ID kategori "induk"?

Contoh kerja akan sangat dihargai.

1
smz

Saya enggan menerbitkan ini sebagai "jawaban saya" karena mungkin akan menunjukkan betapa buruknya PHP dan programmer Joomla saya, tetapi, karena berfungsi ... ini dia:

static function GetCategoriesWithChildren($categories) {
   $results = array();
   $db = JFactory::getDbo();
   foreach ($categories as $baseCategory)
   {
      $query = $db->getQuery(true);
      $query->select('c.path');
      $query->from('#__categories AS c');
      $query->where('c.published > 0');
      $query->where('c.id = ' . $baseCategory);
      $db->setQuery($query);
      $fathersList = $db->loadObjectList();
      foreach ($fathersList as $father)
      {
         $results[] = $baseCategory; // This adds the father only if it is published
         $query = $db->getQuery(true);
         $query->select('c.id');
         $query->from('#__categories AS c');
         $query->where('c.published > 0');
         $query->where('c.path LIKE \'' . $father->path . '/%\'');
         $db->setQuery($query);
         $children = $db->loadObjectList();
         foreach ($children as $category)
         {
            $results[] = $category->id;
         }
      }
   }
   return $results;
}

Fungsi mengambil array ID kategori sebagai argumennya dan mengembalikan array yang berisi semua ID tersebut dan ID dari kategori anak-anak.

Jika ada yang bisa membuatnya lebih baik, saya akan dengan tulus berterima kasih dan mengubah "jawaban pilihan" saya untuk itu. Terima kasih!

Tepuk tangan!

smz

0
smz

Periksa peta bergabung mysql di sini: http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

Salah satunya adalah apa yang Anda cari.

2
user1507

Anda dapat mencoba menggunakan subquery ... Karena Anda tahu id kategori ayah Anda, dan alias unik, Anda mungkin ingin mencoba ide ini (perlu mengubahnya menjadi PHP atau kode SQL dengan tanda kutip dan sebagainya, tentu saja):

SELECT id 
FROM categories 
WHERE path LIKE CONCAT(%,(SELECT alias FROM categories WHERE id = yourid),%) 
AND WHERE id NOT IN 
  (SELECT id 
   FROM categories 
   WHERE alias LIKE CONCAT(%,(SELECT alias FROM categories WHERE id = yourid))
);

Bagian terakhir adalah untuk mencegah kembalinya kategori ayah dari kategori ayah Anda. Anda mungkin ingin mendapatkan alias dalam kueri terpisah untuk menyederhanakan yang ini dan untuk menghindari subquery kedua (yang berlebihan juga). Sudah terlambat bagi saya sekarang untuk memikirkan solusi yang lebih efisien, saya akan menyerahkannya kepada yang lain. Hasilnya mungkin tidak akan termasuk kategori ayah, tetapi Anda sudah tahu id yang itu, kan.

Tidak diuji.

sunting: gunakan jalur alih-alih alias

SELECT id
FROM categories
WHERE path LIKE CONCAT(
  (SELECT path 
   FROM categories
   WHERE id = yourid),%);
1
elk