Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Biểu đồ phả hệ / cây gia đình từ cơ sở dữ liệu

Tôi đã giải quyết vấn đề vài tháng trước ... Tôi đang đăng câu trả lời, vì vậy điều này có thể hữu ích cho các nhà phát triển đồng nghiệp khác ... p.s. Dự án được viết bằng Yii 1.1

Đầu tiên, trong HorseController của tôi đã chỉ định biến kiểu mảng riêng tư nơi tôi sẽ giữ Pedigree:

private $horses = array();

Sau đó, tôi đã viết hàm sẽ lấy tất cả các nút (cha) từ cơ sở dữ liệu:

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

Sau đó, tôi đã sửa đổi ActionView chức năng, trong đó tất cả các nút từ cơ sở dữ liệu sẽ được chuyển đến Chế độ xem

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

Và cuối cùng là một chút MÃ UGLY sẽ hiển thị phả hệ (như thế này Truy vấn phả hệ ) :)

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

Và thế là xong :) Hy vọng nó hữu ích ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SET CHARACTER SET utf8 có cần thiết không?

  2. Tạo bảng mysql với bộ ký tự mặc định rõ ràng, nếu tôi không tạo thì sao?

  3. MySQLdb của Python không thể tìm thấy libmysqlclient.dylib với MySQL của Homebrewed

  4. câu lệnh đã chuẩn bị sẵn trong đó giá trị nằm trong mảng

  5. Nhận vị trí hàng trong truy vấn MYSQL