sql >> Database teknologi >  >> RDS >> Mysql

Stamtavle/slægtsdiagram fra databasen

Jeg har allerede løst problemet for et par måneder siden... Jeg sender et svar, så dette kan være nyttigt for andre udviklere... p.s. Projektet er skrevet i Yii 1.1

For det første i min HorseController tildelt privat array type variabel, hvor jeg vil beholde stamtavle:

private $horses = array();

Derefter skrev jeg en funktion, der henter alle noder (forældre) fra databasen:

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

Derefter ændrede jeg ActionView funktion, hvor alle noder fra databasen vil blive overført til View

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

Og til sidst lidt grim KODE, der vil vise stamtavle (som denne Stamtavleforespørgsel ) :)

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

Og det var det :) Håber det var nyttigt...




  1. Undersøg kontrolkilden for alle kontroller i dit MS Access-projekt

  2. Forskellen mellem flydende og decimal datatype

  3. mysql opdatering inkrement int felt, der er null

  4. MySQl-fejl #1064