it-swarm-vi.com

Làm cách nào tôi có thể chọn ID của danh mục và tất cả các danh mục con (n cấp) của nó?

Bên cạnh danh mục cha mẹ, tôi muốn thu thập đệ quy tất cả các hàng con của nó.

(Mã giả) SELECT IDs FROM #_categories WHERE parent = father

Thay vào đó, SELECT IDs WHERE the first part of path is the parent's path.

Điều này có đúng không? Điều gì sẽ là cách hiệu quả nhất?

Thậm chí còn tốt hơn:

Có một phương pháp tiêu chuẩn (có thể trong ContentModelCategories) để đạt được những gì tôi cần không? Tôi có nên sử dụng ContentModelCategories::getItems(true)? Làm thế nào để tôi gọi nó, với điều kiện tôi đã có ID danh mục "phụ huynh"?

Một ví dụ làm việc sẽ được thực sự đánh giá cao.

1
smz

Tôi miễn cưỡng công bố đây là "câu trả lời của tôi" vì nó có thể sẽ cho thấy mức độ tồi tệ của một người PHP và lập trình viên Joomla, nhưng, khi nó hoạt động ... đây là:

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;
}

Hàm này lấy một mảng các ID danh mục làm đối số của nó và trả về một mảng chứa tất cả các ID đó và ID của bất kỳ danh mục con nào.

Nếu bất cứ ai có thể làm cho nó tốt hơn, tôi sẽ chân thành biết ơn và thay đổi "câu trả lời được chọn" của tôi cho nó. Cảm ơn!

Chúc mừng!

smz

0
smz

Kiểm tra bản đồ tham gia mysql tại đây: http://www.codeproject.com/KB/database/Visual_Query_Joins/Visual_Query_JOINS_orig.jpg

Một trong số đó là những gì bạn đang tìm kiếm.

2
user1507

Bạn có thể thử sử dụng truy vấn con ... Cho rằng bạn biết id của danh mục cha mình và bí danh là duy nhất, bạn có thể muốn thử ý tưởng này (sẽ cần chuyển đổi nó thành PHP hoặc mã SQL có dấu ngoặc kép, v.v, tất nhiên):

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

Phần cuối cùng là để ngăn chặn sự trở lại của các loại cha của bạn loại cha. Bạn có thể muốn lấy bí danh trong một truy vấn riêng để đơn giản hóa truy vấn này và để tránh truy vấn con thứ hai (cũng là dự phòng). Bây giờ là quá muộn để tôi nghĩ về các giải pháp hiệu quả hơn, tôi sẽ để lại cho những người khác. Kết quả có thể sẽ không bao gồm danh mục cha, nhưng bạn đã biết id của cái đó, đúng không.

Không được kiểm tra.

chỉnh sửa: sử dụng đường dẫn thay vì bí danh

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