亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

貢獻(xiàn)一個(gè) Laravel 樹(shù)形結(jié)構(gòu)管理包 ClosureTable

aikin / 744人閱讀

摘要:優(yōu)雅的樹(shù)形數(shù)據(jù)結(jié)構(gòu)管理包基于模式設(shè)計(jì)歡迎不吝優(yōu)雅的樹(shù)形數(shù)據(jù)設(shè)計(jì)模式數(shù)據(jù)和結(jié)構(gòu)分表操作數(shù)據(jù)不影響結(jié)構(gòu)一個(gè)操作簡(jiǎn)單無(wú)需修改表兼容舊數(shù)據(jù)完善的樹(shù)操作方法支持生成樹(shù)形數(shù)據(jù)支持多棵樹(shù)并存多個(gè)根支持節(jié)點(diǎn)樹(shù)修復(fù)支持軟刪除依賴關(guān)于將樹(shù)中每個(gè)節(jié)點(diǎn)與其后代節(jié)點(diǎn)

About

優(yōu)雅的樹(shù)形數(shù)據(jù)結(jié)構(gòu)管理包,基于Closure Table模式設(shè)計(jì).

github 歡迎不吝Star

Features

優(yōu)雅的樹(shù)形數(shù)據(jù)設(shè)計(jì)模式

數(shù)據(jù)和結(jié)構(gòu)分表,操作數(shù)據(jù)不影響結(jié)構(gòu)

一個(gè)Eloquent Trait操作簡(jiǎn)單

無(wú)需修改表,兼容舊數(shù)據(jù)

完善的樹(shù)操作方法

支持生成樹(shù)形數(shù)據(jù)

支持多棵樹(shù)并存(多個(gè)根)

支持節(jié)點(diǎn)/樹(shù)修復(fù)

支持軟刪除

依賴

php > 5.6.0

laravel > 5.1.0

關(guān)于Closure Table

Closure table is a simple and elegant way of storing and querying hierarchical data in any RDBMS. By hierarchical data we mean a set of data that has some parent – child relationship among them. We use the word ‘tree’ instead of hierarchies commonly. As an example we may take the relationships between geographic locations like ‘Countries’, ‘States/ Province’, ‘Districts/ Cities’ etc.

Closure Table將樹(shù)中每個(gè)節(jié)點(diǎn)與其后代節(jié)點(diǎn)的關(guān)系都存儲(chǔ)了下來(lái),
這將需要一個(gè)存儲(chǔ)相互關(guān)系的表name_closure.

部門表:

id name
1 總經(jīng)理
2 副總經(jīng)理
3 行政主管
4 文秘

一個(gè)基本的closure表包含ancestor,descendant,distance3個(gè)字段,如:

ancestor descendant distance
1 1 0
1 2 1
1 3 2
1 4 3
2 2 0
2 3 1
2 4 2
3 3 0
3 4 1
4 4 0

這個(gè)表記錄了每個(gè)部門之間的關(guān)系,并且還記錄了一條自身的關(guān)聯(lián).

使用

ClosureTable提供了大量方法操作樹(shù).

影響樹(shù)結(jié)構(gòu)的方法
makeRoot();
  
// 創(chuàng)建一個(gè)子級(jí)節(jié)點(diǎn),return new model
$menu->createChild($attributes);
  
// 創(chuàng)建一個(gè)新的菜單,此時(shí)該菜單無(wú)任何關(guān)聯(lián),return model
$child = Menu::create($attributes);
  
// 將一個(gè)已存在的菜單添加到子級(jí),$child可為模型實(shí)例、模型實(shí)例集合或id、包含id的數(shù)組,return bool
$menu->addChild($child);
$menu->addChild(12);
$menu->addChild("12");
$menu->addChild([3, 4, 5]);
  
// 移動(dòng)到$parent的下級(jí),后代也將隨之移動(dòng),$parent可為模型實(shí)例或id,return bool
$menu->moveTo($parent);
$menu->moveTo(2); 
$menu->moveTo("2");
  
// 同moveTo()
$menu->addTo($parent);
  
// 添加一個(gè)或多個(gè)同級(jí)節(jié)點(diǎn),$siblings的后代也將隨之移動(dòng),$siblings可為模型實(shí)例集合或id、包含id的數(shù)組,return bool
$menu->addSibling($siblings);
$menu->addSibling(2);
$menu->addSibling("2");
$menu->addSibling([2,3,4]);
  
// 新建一個(gè)同級(jí)節(jié)點(diǎn),return new model
$menu->createSibling($attributes);
  
// 建立一個(gè)自身的關(guān)聯(lián),return bool
$menu->attachSelf();
  
// 解除自身的所有關(guān)聯(lián),并且解除后代的所有關(guān)聯(lián)(這個(gè)操作不保留子樹(shù),將使自己和所有后代都成孤立狀態(tài)),return bool
$menu->detachSelf();
獲取數(shù)據(jù)的方法
getDescendants();
  
// 獲取所有后代,包括自己,return model collection
$menu->getDescendantsAndSelf();
 
 // 獲取所有祖先,return model collection
$menu->getAncestors();
  
// 獲取所有祖先,包括自己,return model collection
$menu->getAncestorsAndSelf();
  
// 獲取所有兒女(直接下級(jí)),return model collection
$menu->getChildren();
  
// 獲取父輩(直接上級(jí)),return model
$menu->getParent();
  
// 獲取祖先(根),return model
$menu->getRoot();

// 獲取所有兄弟姐妹,return model collection
$menu->getSiblings();
  
//獲取所有兄弟姐妹包括自己,return model collection
$menu->getSiblingsAndSelf();
  
// 獲取所有孤立節(jié)點(diǎn)
Menu::getIsolated();
  
Menu::isolated()->where("id", ">", 5)->get();
  
// 獲取所有根
Menu::getRoots();

以上get...()方法都包含一個(gè)query構(gòu)造器,如getDescendants()對(duì)應(yīng)有一個(gè)queryDescendants,這使得你可以在查詢中加入條件查詢或排序

你可以這樣使用$menu->queryDescendants()->where("id", ">", 5)->orderBy("sort","desc")->get();

getRoot(),getParent(),getRoots(),getIsolated()4個(gè)方法沒(méi)有query構(gòu)造器

如果你想獲取只包含單個(gè)或多個(gè)列的結(jié)果可以在get...()方法里傳入?yún)?shù),如:$menu->getAncestors(["id","name"]);

由于數(shù)據(jù)庫(kù)不需要parent_id列,如果你想在結(jié)果中顯示包含此列的內(nèi)容可以在構(gòu)造器后加入withParent(),

如:$menu->queryDescendantsAndSelf()->withParent()->get().
默認(rèn)列名為parent,如果你想自定義這個(gè)列名在model里定義protected $parentColunm = "parent_id"

生成樹(shù)形數(shù)據(jù)

提供多種方法生成樹(shù)形數(shù)據(jù),可從任意節(jié)點(diǎn)生成樹(shù)

getTree();
  
// 當(dāng)前節(jié)點(diǎn)作為根生成樹(shù),以sort字段排序,return tree
$menu->getTree(["sortColumn", "desc"]);
  
// 從根節(jié)點(diǎn)生成樹(shù),return tree
$menu->getRoot()->getTree();

//旁樹(shù),不包含自己和下級(jí),return tree
$menu->getBesideTree();

生成的樹(shù)如下:

[
    "id" => 3,
    "name" => "node3",
    "children" => [
        [
            "id" => 4,
            "name" => "node4"
        ],
        [
            "id" => 5,
            "name" => "node5"
            "children" => [
                [
                    "id" => 6,
                    "name" => "node6"
                ]
            ]
        ]
    ]
]

生成的樹(shù)的children鍵默認(rèn)為children,如果你想自定義可以作為第2個(gè)參數(shù)傳入,如:

$menu->getTree(["sortColumn", "desc"], "son");
如果你想獲取只包含單個(gè)或多個(gè)列的結(jié)果可以作為第3個(gè)參數(shù)傳入,如:
$menu->getTree(["sortColumn", "desc"], "son", ["id", "name"]);

你的表里可能包含多棵樹(shù),如果你想一一獲取他們可以這樣做:

getTree();
}
$data = $mutiTree;

判斷
isRoot();
  
// 是否葉子節(jié)點(diǎn)
$menu->isLeaf();
 
// 是否孤立節(jié)點(diǎn)
$menu->isIsolated();
  
// 是否有上級(jí)
$menu->hasAncestors();
  
// 是否有下級(jí)
$menu->hasDescendants();
  
// 是否有孩子(直接下級(jí))
$menu->hasChildren();
  
// 是否有直接上級(jí)
$menu->hasParent();
  
// 是否$descendant的上級(jí)
$menu->isAncestorOf($descendant);
  
// 是否$ancestor的下級(jí)
$menu->isDescendantOf($ancestor);
  
// 是否$parent的直接下級(jí)
$menu->isChildOf($parent);
  
// 是否$child的直接上級(jí)
$menu->isParentOf($child);
  
// 是否$sibling的同級(jí)(同一個(gè)上級(jí))
$menu->isSiblingOf($sibling);
  
// 如果$beside不是自己也不是自己的后代返回true
$menu->isBesideOf($beside);
數(shù)據(jù)維護(hù)
perfectNode();
  
// 修復(fù)樹(shù)關(guān)聯(lián),注意:這將循環(huán)整顆樹(shù)調(diào)用perfectNode(),如果你的樹(shù)很龐大將耗費(fèi)大量資源,請(qǐng)慎用
$menu->perfectTree();
安裝
$ composer requrie jiaxincui/closure-table

建立樹(shù)需要新建一個(gè)closure表如:menu_closure

unsignedInteger("ancestor");
            $table->unsignedInteger("descendant");
            $table->unsignedTinyInteger("distance");
            $table->primary(["ancestor", "descendant"]);
        });

model里使用JiaxincuiClosureTableTraitsClosureTableTrait.

如果你想自定義表名和字段,可在model里定義以下屬性:$closureTable,$ancestorColumn,$descendantColumn,$distanceColumn.

如果你想自定義生成的樹(shù)形數(shù)據(jù)里parent字段,在model里定義屬性$parentColumn.

如下示例:


接下來(lái),你就可以自由的使用ClosureTable帶來(lái)的所有功能了.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26077.html

相關(guān)文章

  • laravel package收集

    摘要:查找保存下載用搭建自己的緩存?zhèn)}庫(kù)權(quán)限管理的好選擇基于封裝的后臺(tái)管理系統(tǒng),支持手機(jī)和端訪問(wèn)支付寶風(fēng)格的驗(yàn)證器后臺(tái)系統(tǒng)微信接口的部署腳本開(kāi)發(fā)的博客系統(tǒng)百度推送自動(dòng)記錄用戶行為擴(kuò)展一個(gè)項(xiàng)目管理系統(tǒng)根據(jù)生成對(duì)應(yīng)導(dǎo)航的狀態(tài) 1.debug https://github.com/barryvdh/l... showImg(https://segmentfault.com/img/bVmhWL); ...

    psychola 評(píng)論0 收藏0
  • Laravel不權(quán)威導(dǎo)航

    摘要:版微信第三方登陸包括微信微博等等,查看支持列表擴(kuò)展好用的圖片處理,也方便使用百度版百度版支付集合,包含支付寶等支付寶在的封裝各國(guó)語(yǔ)言包,包含簡(jiǎn)體中文生成二維碼工具,親測(cè)好用未完大家可以向我推薦,直接在本文下留言即可。 Laravel不權(quán)威導(dǎo)航 Hi 這里是Roy整理的Laravel相關(guān)索引,希望能幫到大家showImg(http://static.segmentfault.com/bu...

    focusj 評(píng)論0 收藏0
  • 月光寶盒之網(wǎng)站資源收錄

    摘要:開(kāi)源的論壇網(wǎng)站開(kāi)源的論壇源代碼接口管理接口環(huán)境下環(huán)境一鍵安裝軟件二前端資源中國(guó)淘寶鏡像在國(guó)內(nèi),由于墻的原因,安裝包速度很慢,所以,這里建議使用淘寶提供的鏡像安裝前端資源。 為者常成,行者常至。 一、PHP資料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中國(guó)最大的 Laravel 和 PHP 開(kāi)發(fā)者社區(qū)3、Composer使用方法4、Pa...

    learning 評(píng)論0 收藏0
  • 月光寶盒之網(wǎng)站資源收錄

    摘要:開(kāi)源的論壇網(wǎng)站開(kāi)源的論壇源代碼接口管理接口環(huán)境下環(huán)境一鍵安裝軟件二前端資源中國(guó)淘寶鏡像在國(guó)內(nèi),由于墻的原因,安裝包速度很慢,所以,這里建議使用淘寶提供的鏡像安裝前端資源。 為者常成,行者常至。 一、PHP資料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中國(guó)最大的 Laravel 和 PHP 開(kāi)發(fā)者社區(qū)3、Composer使用方法4、Pa...

    2bdenny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

aikin

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<