Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wykres drzewa rodowego/rodzinnego z bazy danych

Już kilka miesięcy temu rozwiązałem problem... zamieszczam odpowiedź, więc może to być pomocne dla innych programistów... p.s. Projekt został napisany w Yii 1.1

Po pierwsze, w moim HorseController przypisana zmienna typu private array, w której zamierzam przechowywać Rodowód:

private $horses = array();

Następnie napisałem funkcję, która pobierze wszystkie węzły (rodzice) z bazy danych:

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

Następnie zmodyfikowałem ActionView funkcja, w której wszystkie węzły z bazy danych zostaną przekazane do Widoku

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

I na koniec trochę NIEPRZYJEMNEGO KODU, który pokaże rodowód (tak jak to Zapytanie o rodowód ) :)

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

I to wszystko :) Mam nadzieję, że było to pomocne...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj parametru procedury składowanej dla parametru jednostki DATE_SUB

  2. mysqldump tworzenie kopii zapasowych i przywracanie na zdalnym serwerze

  3. Wstaw bieżącą datę w formacie datetime mySQL

  4. Obsługa restartu mysql w SQLAlchemy

  5. Przyznaj MySQL uprawnienia do tabel i kolumn