Download the PHP package efureev/laravel-trees without Composer
On this page you can find all versions of the php package efureev/laravel-trees. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package laravel-trees
Contents:
- Theory
- Requirements
- Installation
- Testing
- Documentation
- Migrating
- Relationships
- Creating nodes
- Moving nodes
- Deleting nodes
- Retrieving nodes
- Nodes queries
- Model's helpers
- Console Tree
Information
This package is Multi-Tree structures (a lot of root-nodes).
What are nested sets?
Nested sets or Nested Set Model is a way to effectively store hierarchical data in a relational table. From wikipedia:
The nested set model is to number the nodes according to a tree traversal, which visits each node twice, assigning numbers in the order of visiting, and at both visits. This leaves two numbers for each node, which are stored as two attributes. Querying becomes inexpensive: hierarchy membership can be tested by comparing these numbers. Updating requires renumbering and is therefore expensive.
Applications
NSM shows good performance when tree is updated rarely. It is tuned to be fast for getting related nodes. It'is ideally suited for building multi-depth menu or categories for shop.
Requirements
- PHP: 8.2|8.3
- Laravel: ^11.*
It is highly suggested to use database that supports transactions (like MySql's InnoDb, Postgres) to secure a tree from possible corruption.
Installation
To install the package, in terminal:
Testing
or
Documentation
This package works with different model primary key: int
, uuid
. This package allows to creating multi-root
structures: no only-one-root! And allow to move nodes between trees.
Migrating
Model for Single tree structure:
or with custom base config
or with custom config
Model for Multi tree structure and with primary key type uuid
:
Use in migrations:
Relationships
Node has following relationships that are fully functional and can be eagerly loaded:
- Node belongs to
parent
- Node has many
children
- Node has many
ancestors
- Node has many
descendantsNew
Creating nodes
Creating root-nodes
When you creating a root-node: If you use ...
- single-mode: you may to create ONLY one root-node.
- multi-mode: it will be insert as root-node and different
tree_id
. Default: increment by one. You may customize this function.
These actions are identical:
Creating non-root-nodes
When you creating a non-root node, it will be appended to the end of the parent node.
If you want to make node a child of other node, you can make it last or first child.
In following examples, $parent
is some existing node.
Appending to the specified parent
Add child-node into node. Insert after other children of the parent.
Prepending to the specified parent
Add child-node into node. Insert before other children of the parent.
Insert before parent node
Add child-node into same parent node. Insert before target node.
Insert after parent node
Add child-node into same parent node. Insert after target node.
Moving nodes
Move node up in self parent scope
Move node down in self parent scope
Deleting nodes
To delete a node:
IMPORTANT! if deleting node has children - they will be attach to deleted node parent. This behavior may be changed.
IMPORTANT! Nodes are required to be deleted as models! DO NOT try do delete them using a query like so:
This will break the tree!
SoftDeletes
trait is supported, also on model level.
Also you may to delete all children:
Retrieving nodes
In some cases we will use an $id
variable which is an id of the target node.
Ancestors and descendants
Ancestors make a chain of parents to the node. Helpful for displaying breadcrumbs to the current category.
Descendants are all nodes in a sub tree, i.e. children of node, children of children, etc.
Both ancestors and descendants can be eagerly loaded.
It's relationships:
ancestors
: AncestorsRelationdescendantsNew
: DescendantsRelationchildren
: HasManyparent
: BelongsTo
Parent
Get parent node
Collection of parents
Siblings
Siblings are nodes that have same parent.
Nodes queries
Method | Example | Description |
---|---|---|
parents(int $level = null) | $node->parents(2)->get(); |
Select chain of parents |
root() | $node->root()->get(); |
Select only root nodes |
notRoot() | $node->notRoot()->get(); |
Select only not root nodes |
siblings() | $node->siblings()->get(); |
|
siblingsAndSelf() | $node->siblingsAndSelf()->get(); |
|
prev() | $node->prev()->first(); |
|
next() | $node->next()->first(); |
|
prevSiblings() | $node->prevSiblings()->get(); |
|
nextSiblings() | $node->nextSiblings()->get(); |
|
prevSibling() | $node->prevSibling()->first(); |
|
nextSibling() | $node->nextSibling()->first(); |
|
prevNodes() | $node->prevNodes()->get(); |
|
nextNodes() | $node->nextNodes()->get(); |
|
leaf() | $node->leaf()->first(); |
Select ended node |
leaves(int $level = null) | $node->leaves(2)->first(); |
|
descendants($level, $andSelf, $backOrder) | $node->descendants(2, true)->get(); |
Get all descendants |
whereDescendantOf($id) | $node->whereDescendantOf(2)->get(); |
Get all descendants |
whereNodeBetween([$left, $right]...) | $node->whereDescendantOf(2)->get(); |
Add node selection statement between specified range. |
defaultOrder($dir) | $node->defaultOrder(true)->get(); |
Add node selection statement between specified range. |
byTree($dir) | $node->byTree(1)->get(); |
Select nodes by tree_id . |
Model's helpers
Method | Return | Example |
---|---|---|
isRoot() | bool | $node->isRoot(); |
isChildOf(Model $node) | bool | $node->isChildOf($parentNode); |
isLeaf() | bool | $node->isLeaf(); |
equalTo(Model $node) | bool | $node->equalTo($parentNode); |
Console Tree
Checking consistency
You can check whether a tree is broken (i.e. has some structural errors):
It is possible to get error statistics:
It will return an array with following keys:
oddness
- the number of nodes that have wrong set oflft
andrgt
valuesduplicates
- the number of nodes that have samelft
orrgt
valueswrong_parent
- the number of nodes that have invalidparent_id
value that doesn't correspond tolft
andrgt
valuesmissing_parent
- the number of nodes that haveparent_id
pointing to node that doesn't exists
Fixing tree
Since v3.3.1 tree can now be fixed.
For single tree:
For multi tree:
All versions of laravel-trees with dependencies
illuminate/database Version ^11.0
illuminate/events Version ^11.0
efureev/support Version ^4.27