【问题标题】:Pedigree/Family tree chart from database来自数据库的谱系/家谱图
【发布时间】:2015-04-26 17:50:13
【问题描述】:

我正在尝试从数据库生成谱系(换句话说,家谱:))表...

我的架构:

CREATE TABLE `horses` ( 
`horse_id` int(10) NOT NULL AUTO_INCREMENT,
`horse_name` varchar(32) NOT NULL,
`horse_sire` int(10) DEFAULT NULL,
`horse_dam` int(10) DEFAULT NULL, 
PRIMARY KEY (`horse_id`),
KEY `FKsire` (`horse_sire`),
KEY `FKdam` (`horse_dam`),
CONSTRAINT `FKdam` FOREIGN KEY (`horse_dam`) REFERENCES `horses` (`horse_id`),
CONSTRAINT `FKsire` FOREIGN KEY (`horse_sire`) REFERENCES `horses` (`horse_id`)
)

附言'horse_dam' 和 'horse_sire' 代表父母...... 我在这个问题上花了几天时间,搜索,试验...... 目前我有这个部分解决方案:

display_children($selected_horse_id, 5);

        function display_children($parent, $level) {
            mysql_connect('localhost','root','');
            mysql_select_db('hdb');
            $result = mysql_query('SELECT * FROM horses WHERE horse_id="'.$parent.'";');


            while ($row = mysql_fetch_array($result)) {

                echo "<tr><td>";
                echo $row['horse_name'];
                echo "</td></tr>";

                display_children($row['horse_dam'], $level+1);
                display_children($row['horse_sire'],$level+1);
            }
        }

在一行中生成表:(我想不出正确的方法来实现它... 而我想要的结果是Pedigree Query

非常感谢任何帮助或提示 :), 提前致谢

【问题讨论】:

    标签: php mysql recursion html-table family-tree


    【解决方案1】:

    几个月前我已经解决了问题...我正在发布答案,所以这可能对其他开发人员有帮助... p.s.该项目是用 Yii 1.1 编写的

    首先,在我的 HorseController 分配的私有数组类型变量中,我将保留 Pedigree:

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

    最后是一些显示血统的丑陋代码(例如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>
    

    就是这样 :) 希望对您有所帮助...

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多