sql >> Databasteknik >  >> RDS >> Mysql

Stamtavla/släktträdsdiagram från databasen

Jag har redan löst problemet för några månader sedan... Jag postar svar, så detta kan vara till hjälp för andra utvecklare... p.s. Projektet skrevs i Yii 1.1

För det första i min HorseController tilldelad privat arraytypvariabel där jag ska behålla stamtavla:

private $horses = array();

Sedan skrev jag en funktion som hämtar alla noder (föräldrar) från 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;
}

Sedan ändrade jag ActionView funktion, där alla noder från databasen skickas till View

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

Och till sist lite FUL KOD som kommer att visa stamtavla (som denna Stamtavlafråga ) :)

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

Och det var allt :) Hoppas det var till hjälp...




  1. ange nytt värde för ft_min_word_len FULLTEXT i mysql

  2. Ta bort förälder om den inte hänvisas till av något annat barn

  3. Överträdelse av integritetsbegränsning:1452 Kan inte lägga till eller uppdatera en underordnad rad:

  4. Oracle SQL:Uppdatera en tabell med data från en annan tabell