tp5對分類數據表的信息讀取與展示,我們即可以控制器完成,也可以在對應的模型中完成。本案例,我們在模型中完全成。況且,對數據表的增,刪改查操作,本來就是模型的本職工作。
首先聲明一下,我們采用遞歸的方式來實現無限分類。但無限分類的實現,不是只是遞歸一種方式,還有一種是全路徑方式,也可以實現,不過,這種方式通常用在全路徑導航菜單中。所以,這里我們還是用最常見的遞歸函數來實現:無限分類。
首先我們先創建一個靜態方法:getCate,為什么要靜態方式,因為靜態方法執行效率高,不需要實例化,而且,分類查詢是使用非常頻繁的操作,很多查詢都要依賴分類查詢的結果。
當前的getCate方法,有三個參數:
第一個是$pid,是父類的id,默認為0,表示從頂級開始查起。
第二個參數是返回的查詢結果,我們放在一個數組中返回,注意,這個變量是引入方式傳入的。
在遞歸函數中,返回結果有三種方式:
第一種就是大家比較熟悉的,使用全局變量$_GLOBALS[],這個方法有副作用,我們不用它;
第二種方式也不錯,是在函數中用static關鍵字,聲明一個靜態變量,它可以將每一次的遞歸執行結果進行累計,最后再返回,非常好理解,但占用資源過多,執行效率低;
第三種,就是采用引用參數的方式,來返回結果,這也是目前主流的技術。盡管理解起來有難度,但執行效率是最高的,我們要玩,就玩大的,所以這里,我們就直接采用引用,來返回查詢結果。
第三個參數,可以沒有,它是用來設置一下分類之間的層次顯示的,可以讓結果看上去更直觀清晰。
<?php namespace app\admin\model; use think\Collection; use think\Model; class Category extends Model { //創建一個靜態方法getCate,來獲取分類信息 /** * @param int $pid: 當前分類的父id * @param array $result:引用返回值 * @param int $blank:設置分類之間的顯示提示 */ public static function getCate($pid=0, &$result=[], $blank=0) { //1.分類表查詢:$pid $res = self::all(['pid'=>$pid]); //2.自定義分類名稱前面的提示信息 $blank += 2; //3.遍歷分類表 foreach ($res as $key => $value) { //3-1自定義分類名稱的顯示格式 $cate_name = '|--'.$value->cate_name; $value->cate_name = str_repeat(' ',$blank).$cate_name; //3-2將查詢到的當前記錄保存到結果$result中 $result[] = $value; //3-3關鍵:將當前記錄的id,做為下一級分類的父id,$pid,繼續遞歸調用本方法 self::getCate($value->id, $result, $blank); } //4.返回查詢結果,調用結果集類make方法打包當前結果,轉為二維數組返回 return Collection::make($result)->toArray(); } }
控制器中調用代碼:
public function edit(Request $request) { //1.獲取一下分類id $cate_id = $request -> param('id'); //2.查詢要更新的數據 $cate_now = CategoryModel::get($cate_id); //3.遞歸查詢所有的分類信息 $cate_level = CategoryModel::getCate(); //4.模板賦值 $this -> view -> assign('cate_now', $cate_now); $this -> view -> assign('cate_level', $cate_level); //5.渲染模板 return $this -> view -> fetch('category_edit'); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。