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.
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
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.
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),%);