Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

डेटाबेस से वंशावली/पारिवारिक वृक्ष चार्ट

मैंने कुछ महीने पहले ही समस्या का समाधान कर लिया है ... मैं उत्तर पोस्ट कर रहा हूं, इसलिए यह अन्य साथी डेवलपर्स के लिए सहायक हो सकता है ... पीएस। परियोजना 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;
}

फिर, मैंने एक्शन व्यू . को संशोधित किया फ़ंक्शन, जहां डेटाबेस से सभी नोड्स को देखने के लिए पास किया जाएगा

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

और अंत में थोड़ा सा UGLY CODE जो वंशावली दिखाएगा (जैसे यह Pedigree Query ) :)

<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. मैसकल डेटाटाइम डिफ़ॉल्ट CURRENT_TIMESTAMP त्रुटि

  2. लारवेल - पूरे संग्रह को कैसे अपडेट करें

  3. किसी अन्य तालिका से चयन के साथ MySQL अद्यतन

  4. PDO::rowCount बनाम COUNT(*)

  5. पुनर्प्राप्त हार्ड डिस्क से MySQL डेटाबेस फ़ोल्डर को पुनर्स्थापित करें