PHP+MySQL樹狀圖

產出MySQL

首先因為我們是要動態產出這些選單,所以我們要先長好我們的database,大概長這樣:

產出PHP

由於我是用laravel這個framework以下全部都會是laravel的code,我們現在必須先連接到那個table:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class NewClass extends Model
{

    public $table = 'newclass';
    public $primaryKey = 'id';
    public $incrementing = true;
    public $timestamps = false;

}

再來產出抓取這個資料庫資料的repository:

<?php
namespace App\Repositories;
use Illuminate\Http\Request;
use App\Models\NewClass;
use Carbon\Carbon;

class NewClassRepository {
    /**
   * 注入的 NewClass model
   * @var type
   */
  protected $model;
  public function __construct(NewClass $model) {
    $this->model = $model;
  }

  public static function withNew() {
    return new NewClassRepository(new NewClass());
  }

    public function getMainData() {
    return $this->model->get();
  }
}

再來就是重頭戲controller的部份:

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Repositories\NewClassRepository;

class TestClassController extends Controller {
    protected $repository;
  public function __construct(NewClassRepository $repository) {
      $this->repository = $repository;
  }

  private static $array; // 從DB查詢出的所有分類資料
  private static $str = ""; // 串接字串用

  public function classData() {
    // 到repository抓資料
    $result = $this->repository->getMainData();

    foreach($result as $data){
      TestClassController::$array[] = array($data->id,$data->f_id,$data->name);
    }

    TestClassController::$str = $this->classMenu();
    $re = TestClassController::$str;
    return View('test',compact('re'));
  }

  /**
   * 編輯字串要回傳到view的
   * @param  integer $f_id [父層]
   */
  public function classMenu($f_id =0){
    for($i=0;$i<count(TestClassController::$array);$i++){

      if(TestClassController::$array[$i][1]==$f_id){
        TestClassController::$str = TestClassController::$str."<ul>";

        TestClassController::$str = TestClassController::$str."<li>";
        // 列出它的名稱
        TestClassController::$str = TestClassController::$str.TestClassController::$array[$i][2];
        TestClassController::$str = TestClassController::$str."</li>";
        // 順便找它的子層直接列出來
        $this->classMenu(TestClassController::$array[$i][0]);

        TestClassController::$str = TestClassController::$str."</ul>";
      }
    }
    return TestClassController::$str;
  }
}

Last updated