2015-04-26 7 views
0

Я пытаюсь создать родословная (другими словами генеалогическое дерево :)) таблицы из базы данных ...Родословная/Генеалогическое дерево диаграммы из базы данных

Моя схема:

CREATE TABLE `horses` ( 
`horse_id` int(10) NOT NULL AUTO_INCREMENT, 
`horse_name` varchar(32) NOT NULL, 
`horse_sire` int(10) DEFAULT NULL, 
`horse_dam` int(10) DEFAULT NULL, 
PRIMARY KEY (`horse_id`), 
KEY `FKsire` (`horse_sire`), 
KEY `FKdam` (`horse_dam`), 
CONSTRAINT `FKdam` FOREIGN KEY (`horse_dam`) REFERENCES `horses` (`horse_id`), 
CONSTRAINT `FKsire` FOREIGN KEY (`horse_sire`) REFERENCES `horses` (`horse_id`) 
) 

P.S. «Horse_dam» и «horse_sire» представляет родители ... я проводил дни на этой проблеме, поиск, экспериментируя ... И в настоящее время у меня есть это частично решение:

display_children($selected_horse_id, 5); 

     function display_children($parent, $level) { 
      mysql_connect('localhost','root',''); 
      mysql_select_db('hdb'); 
      $result = mysql_query('SELECT * FROM horses WHERE horse_id="'.$parent.'";'); 


      while ($row = mysql_fetch_array($result)) { 

       echo "<tr><td>"; 
       echo $row['horse_name']; 
       echo "</td></tr>"; 

       display_children($row['horse_dam'], $level+1); 
       display_children($row['horse_sire'],$level+1); 
      } 
     } 

, который генерирует таблицу в одну строку: (я не могу думать надлежащим образом реализовать его ... И результат я хочу Pedigree Query

Любая помощь или подсказка высоко ценится :), Спасибо заранее

ответ

0

я уже решена проблема несколько месяцев назад ... Я отправляю ответ, поэтому это может быть полезно другим разработчикам ... p.s. Проект был написан в Yii 1,1

Во-первых, в моем HorseController присвоенного переменной-типа массив, в котором я буду держать родословная:

private $horses = array(); 

Тогда я написал функцию, которая будет получать все узлы (родители) из базы данных:

public function getParents($id) 
{ 
    global $horses; 
    $horses[] = Horses::model()->findByPk($id)->horse_id; 
    if($this->loadModel($id)->horse_sire != null && $this->loadModel($id)->horse_dam != null) 
    { 
     $this->getParents($this->loadModel($id)->horse_sire); 
     $this->getParents($this->loadModel($id)->horse_dam); 
    } 
    return $horses; 
} 

Затем я изменил ActionView функцию, где будут переданы все узлы из базы данных для просмотра

public function actionView($id) 
{ 
    $this->horses = $this->getParents($id); 
    $this->render('view',array(
     'model'=>$this->loadModel($id), 
     'parents'=>$this->horses, 
    )); 
} 

И, наконец, немного уродливый код, который будет отображаться родословная (как этот Pedigree Query) :)

<table> 
      <?php 
       $reverse_multiplier = (count($parents)+1)/2; 
       $last_node_count = 0; 
       for($i = 0; $i < count($parents); $i++) 
       { 
        if($i == 0 && $last_node_count ==1) 
         echo "<tr>"; 

        echo "<td rowspan='$reverse_multiplier'>"; 

        echo "<a href=".Yii::app()->baseUrl."/index.php/horses/".Horses::model()->model()->findByPk($parents[$i])->horse_id." >"; 
        echo Horses::model()->model()->findByPk($parents[$i])->horse_name; 
        echo "</a>"; 
        echo "<br/>"; 
        echo Horses::model()->model()->findByPk($parents[$i])->horse_yob; 

        echo "</td>"; 
        if($reverse_multiplier == 1 || $reverse_multiplier == 0.5) 
         echo "</tr>"; 

        if($reverse_multiplier == 0.5 && $last_node_count <= (count($parents)+1)/4) 
         $reverse_multiplier = (count($parents)+1)/8; 
        else 
         $reverse_multiplier = $reverse_multiplier/2; 

        if($last_node_count == (count($parents)+1)/4) 
        { 
         $reverse_multiplier = (count($parents)+1)/4; 
         $last_node_count=0; 
        } 
        if($reverse_multiplier == 0.5 || $reverse_multiplier == 1) 
         $last_node_count++; 
       } 
      ?> 
     </table> 

И вот это :) Надеюсь, что это было полезно ...

 Смежные вопросы

  • Нет связанных вопросов^_^