2016-05-03 5 views
1

Wir haben hierarchische Beziehung in einer Tabelle wie diesehierarchische Beziehung in PHP für Menü

Tabellenname: Kategorie

id  parent_id title 
    1   0   main menu 
    2   1   sub_menu1 
    3   2   sub_sub_menu1 

eine andere Tabelle: domain

id  cat_id  name 
1   1   main domain 
2   2   sub domain 
3   3   sub sub domain 

Wir versuchen Kategorie zeigen und Unterkategorie Wie mein Freund vorgeschlagen, es ist zu komplex und zu teuer, um diese Art von Beziehung via SQL zu zeigen, so zogen wir um dies über php zu zeigen.

Wir schrieben diesen Code: -

function getSubCatCount($data,$parent){ 
    $count=0; 
    $count =$count+ domainCatCount($parent); 
    return $count; 
} 


function menuList($data, $parent = 0,$st) 
{ 
    static $i = 0; 
    $tab = str_repeat(" ",$i); 
    if($data[$parent]) 
    { 
    $html .= ""; 
    $i++; 


    if($i==1) 
       $html .= '<ul data-menu="main" class="menu__level">'; 
    else{ 
       $html .= '<ul data-menu="submenu-'.$parent.'" class="menu__level">'; 
    } 
    $tmpLis=""; 
     foreach($data[$parent] as $v) 
     { 
      $html .= '<li class="menu__item"><a href="#" class="menu__link '; 
      $child = menuList($data, $v['id'],"false"); 
      $html .= '" data-submenu="submenu-'.$v['id'].'" ';  
      //if(!$child) 
      { 
       $tmpLis.=domainHtmlList($v['id']); 
      } 
      $html .= '>'; 


      $html .= $v['title'].'<div style="float: right;"><table style="width: 145px;"><tr><td style="width: 30%;"><img src="https://cdn3.iconfinder.com/data/icons/metro-explorer/512/my_location-512.png" style="width: 20px;height: 20px;" title="usages">'.getUsages($v['id']).'</td><td style="width: 30%;"><img src="http://www.clubs.uci.edu/cae/a/src/1432405005258.png" style="width: 20px;height: 20px;" title="domains">'.getDomainCount($data,$v['id']).'</td><td style="width: 30%;"><img src="https://cdn2.iconfinder.com/data/icons/flat-ui-icons-24-px/24/eye-24-128.png" style="width: 20px;height: 20px;" title="views">'.getViews($v['id']).'</td></tr></table></div></a></li>'; 
//if (preg_match_all('/<[a-z \'"]*data-menu=[\'"]submenu-'.$v['id'].'[\'"][^>]*>([^<]*)/i', $html, $matches)) { 
    //print_r($matches); 
    //$child = menuList($data, $v['id'],"true"); 
//$html .= $child; 
//} 

     } 
      if($st!="true") 
      $html .= "</ul>"; 
      $html .=$tmpLis; 
     foreach($data[$parent] as $v) 
     { 
      $child = menuList($data, $v['id'],"false"); 
      if($child) 
      { 
       $i–; 
       $html .= $child; 
      } 
     } 
     return $html; 
    } 
    else 
    { 
     return false; 
    } 
} 



function domainHtmlList($i){ 
global $db; 

$domainCatRows = $db->getRows("SELECT * FROM `url_domain` WHERE `category` ='".$i."'"); 
if(count($domainCatRows)>0) 
    $html = '<ul data-menu="submenu-'.$i.'" class="menu__level">'; 
foreach($domainCatRows as $ff) 
{ 
$dom=$ff['domain']; 
$count=0; 
if($ff['domain']=="[[[main_url]]]") 
$dom="123.yt"; 
$html .= '<li class="menu__item"><a href="#" class="menu__link '; 
    $html .= 'submenu-child" data-key="'.$ff['id'].'" data-domain="'.$dom.'" '; 
$html .= '>'; 
$domainId=$ff['id']; 
    //for usages 
    $shortUrlRows = $db->getRows("SELECT count(*) as usages_count FROM `shorturl` WHERE `urlDomainId` in (".$domainId.") "); 
    foreach($shortUrlRows as $val) 
    { 
     $count=$count+$val['usages_count']; 
    } 
    //for views 
    //$tmp= $db->getRows("SELECT count(*) as count FROM `stats` WHERE `url` like '%".$dom."%'"); 
    //echo "SELECT * FROM `stats` WHERE `reffer` like '%".$dom."%'"."<br/>"; 
    //print_r($tmp); 

    $tmp= $db->getRows("SELECT GROUP_CONCAT(id SEPARATOR ',') as shortUrlDomain FROM `shorturl` WHERE `urlDomainId` in (".$domainId.")"); 
    //echo "SELECT GROUP_CONCAT(id SEPARATOR ',') as shortUrlDomain FROM `shorturl` WHERE `urlDomainId` in (".$domainId.")"."<br/>"; 
    $tmpsts= $db->getRows("SELECT count(*) as count FROM `stats` WHERE `page_title` in (".$tmp[0]['shortUrlDomain'].")"); 
    //echo "SELECT count(*) as count FROM `stats` WHERE `page_title` in (".$tmp[0]['shortUrlDomain'].")"."<br/>"; 
    //$count=$count+$tmpsts[0]['count'];   

    $html .="<div style='float:right;'><table style='width: 140px;'><tr><td style='width: 30%;'><img src='https://cdn3.iconfinder.com/data/icons/metro-explorer/512/my_location-512.png' style='width: 20px;height: 20px;' title='usages'>".$count."</td><td style='width: 30%;'><img src='https://cdn2.iconfinder.com/data/icons/flat-ui-icons-24-px/24/eye-24-128.png' style='width: 20px;height: 20px;' title='views'>".$tmpsts[0]['count']."</td></tr></table></div>"; 
    $html .= $dom.'</a>'; 
      $html .='</li>'; 
    } 
if(count($domainCatRows)>0) 
$html .= "</ul>"; 
return $html; 
} 

Nun das Problem ist, wenn wir Unterkategorie und Domain sowohl in einer Kategorie haben es nicht beide zeigen. Es zeigt nur entweder Unterkategorie oder Domäne. Wir haben alles versucht, aber nichts davon funktioniert. Wie zeigen wir diese Art von Beziehung?

Antwort

0

Ich empfehle jedem, der dieses Problem hat, 'Nested Tree Model' zu verwenden.

Erstellen Sie 2 neue int-Spalten (lft und rgt) in Ihrer Kategorietabelle und füllen Sie sie mit den Werten, die der Algorithmus liefert (Lesen Sie einfach einige Dokumentation, es ist nicht schwer zu verstehen). Sobald dies erledigt ist, können Sie alle Hauptkategorien mit dieser Abfrage erhalten:

SELECT * FROM categories WHERE parent_id = 0 OR parent_id IS NULL 

Nun, für jede Hauptkategorie, bekommen alle ihre Childs.

SELECT * FROM categories 
WHERE lft >= (
     SELECT lft FROM categories 
     WHERE id = {$id} 
) AND rgt <= (
     SELECT rat FROM categories 
     WHERE id = {$id} 
) 
ORDER BY lft; 

Wikipedia mich mit dem Algorithmus hilft viel: https://en.wikipedia.org/wiki/Nested_set_model

Darüber hinaus gibt es einige PHP-Bibliotheken, wie dieser. http://www.sideralis.org/baobab/

Ich hoffe, es wird Ihnen helfen,

Grüße.