sql >> データベース >  >> RDS >> Mysql

データベースからの血統/家系図

    私は数ヶ月前にすでに問題を解決しました...私は答えを投稿しているので、これは他の仲間の開発者に役立つかもしれません...p.s。プロジェクトはYii1.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;
    }
    

    次に、 ActionViewを変更しました 関数。データベースのすべてのノードがViewに渡されます

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

    そして最後に、血統を表示する少し醜いコード(このような血統クエリ ):)

    <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. SQLite Min()のしくみ

    2. Doctrine 2でQueryBuilderを使用してSELECTサブクエリでLEFTJOINを作成するにはどうすればよいですか?

    3. ProfessionalSSRSレポートのストアドプロシージャの書き方

    4. PostgreSQLのバージョンを確認する方法