Mysql
 sql >> база данни >  >> RDS >> Mysql

Диаграма на родословието/родословното дърво от базата данни

Вече разреших проблема преди няколко месеца... Публикувам отговор, така че това може да е полезно за други колеги разработчици... 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 функция, където всички възли от базата данни ще бъдат предадени на View

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

И накрая малко ГРОЗЕН КОД, който ще показва родословие (като това Запитване за родословие ) :)

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

И това е :) Дано е било полезно...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Основната таблица или изглед не са намерени:1146 Таблица Laravel 5

  2. Как да наблюдавате MySQL/MariaDB бази данни с помощта на Netdata на CentOS 7

  3. Групирайте изхода на SHOW COLUMNS в списък, разделен със запетая

  4. Как да съхранявам ежедневни записи от mysql таблица в друга?

  5. Използване на MySQL релационни бази данни на Arch Linux