sql >> Database >  >> RDS >> Mysql

Stamboom/stamboomkaart uit database

Ik heb het probleem een ​​paar maanden geleden al opgelost... Ik plaats een antwoord, dus dit kan nuttig zijn voor andere collega-ontwikkelaars... p.s. Het project is geschreven in Yii 1.1

Ten eerste, in mijn HorseController toegewezen private array type variabele waar ik Pedigree ga bewaren:

private $horses = array();

Vervolgens schreef ik een functie die alle knooppunten (ouders) uit de database haalt:

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

Vervolgens heb ik ActionView gewijzigd functie, waarbij alle knooppunten uit de database worden doorgegeven aan View

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

En tot slot een beetje LELIJKE CODE die stamboom laat zien (zoals deze Stamboomquery ) :)

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

En dat was het :) Ik hoop dat het nuttig was...




  1. Best practices voor het werken met meerdere tabellen

  2. ASP.Net / MySQL:inhoud vertalen in verschillende talen

  3. Postgres-wachtwoordverificatie mislukt

  4. Een voorwaardelijke UPDATE-instructie gebruiken in SQL