it-swarm-tr.com

Bir kategorinin kimliklerini ve tüm (n düzeyleri) alt kategorilerini nasıl seçebilirim?

Ana kategorinin yanı sıra, tüm alt satırlarını yinelemeli olarak toplamak istiyorum.

(Sahte kod) SELECT IDs FROM #_categories WHERE parent = father

Alternatif olarak, SELECT IDs WHERE the first part of path is the parent's path.

Bu doğru mu? En verimli yol ne olacak?

Daha iyi:

İhtiyacım olanı elde etmek için standart bir yöntem var mı (muhtemelen ContentModelCategories içinde)? ContentModelCategories::getItems(true) kullanmalı mıyım? Zaten "üst" kategori kimliğine sahip olduğum göz önüne alındığında, bunu nasıl çağırabilirim?

Çalışan bir örnek gerçekten takdir edilecektir.

1
smz

Muhtemelen ne kadar kötü bir PHP ve Joomla programcısı olduğumu göstereceği için bunu "cevabım" olarak yayınlamak konusunda isteksizim, ama çalıştığı gibi ... işte burada:

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

İşlev, bağımsız değişken olarak bir kategori kimliği dizisi alır ve tüm bu kimlikleri ve herhangi bir alt kategorinin kimliklerini içeren bir dizi döndürür.

Birisi daha iyi yapabilirse, içtenlikle minnettar olacağım ve "seçilmiş cevabımı" değiştireceğim. Teşekkürler!

Şerefe!

smz

0
smz

Mysql birleştirme haritasını buradan kontrol edin: http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

Bunlardan biri aradığınız şey.

2
user1507

Bir alt sorgu kullanmayı deneyebilirsiniz ... Baba kategorinizin kimliğini bildiğiniz ve takma ad benzersiz olduğu göz önüne alındığında, bu fikri denemek isteyebilirsiniz (PHP veya tabii ki tırnak işaretleri ve benzeri SQL kodu):

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

Son bölüm, baba kategorinizin baba kategorilerinin geri gelmesini önlemektir. Bunu basitleştirmek ve ikinci alt sorgudan (bu da gereksiz) kaçınmak için takma adı ayrı bir sorguda almak isteyebilirsiniz. Şimdi daha verimli çözümler düşünmek benim için çok geç, bunu başkalarına bırakacağım. Sonuç muhtemelen baba kategorisini içermeyecektir, ancak bunun kimliğini zaten biliyorsunuz, değil mi?.

Test edilmedi.

edit: takma ad yerine yolu kullan

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