Skip to content
A Laravel Package that extends Eloquent\Collection to handle nested items following adjacency list model.
PHP
Branch: master
Clone or download
Latest commit 60db41b Sep 4, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Use of array helper removed Feb 1, 2019
.gitignore init Feb 18, 2015
LICENCE
README.md array syntax error in readme Nov 6, 2018
composer.json Laravel 6 Sep 3, 2019

README.md

NestableCollection

SensioLabsInsight StyleCI

A Laravel/Lumen Package that extends collections to handle nested items following adjacency list model.

Installation

Run composer require typicms/nestablecollection

Usage

The model must have a parent_id attributes :

protected $fillable = [
    'parent_id',
    //
];

and must use the following trait:

use TypiCMS\NestableTrait;

Now each time you get a collection of that model, it will be an instance of TypiCMS\NestableCollection in place of Illuminate\Database\Eloquent\Collection.

If you want a tree of models, simply call the nest method on a collection ordered by parent_id asc :

Model::orderBy('parent_id')->get()->nest();

Of course you will probably want a position column as well. So you will have to order first by parent_id asc and then by position asc.

Change the name of subcollections

BBy default, the name of the subcollections is items, but you can change it by calling the childrenName($name) method : For example if you want your subcollections being named children:

$collection->childrenName('children')->nest();

Indented and flattened list

listsFlattened() method generate the tree as a flattened list with id as keys and title as values, perfect for select/option, for example :

[
    '22' => 'Item 1 Title',
    '10' => '    Child 1 Title',
    '17' => '    Child 2 Title',
    '14' => 'Item 2 Title',
]

To use it, first call the nest() method, followed by the listsFlattened() method:

Model::orderBy('parent_id')->get()->nest()->listsFlattened();

By default it will look for a title column. You can send a custom column name as first parameter:

Model::orderBy('parent_id')->get()->nest()->listsFlattened('name');

Four spaces are used to indent by default, to use your own use the setIndent() method, followed by the listsFlattened() method:

Model::orderBy('parent_id')->get()->nest()->setIndent('> ')->listsFlattened();

Results:

[
    '22' => 'Item 1 Title',
    '10' => '> Child 1 Title',
    '17' => '> Child 2 Title',
    '14' => 'Item 2 Title',
]

Nesting a subtree

This package remove items that have missing ancestor, this doesn’t allow you to nest a branch of a tree. To avoid this, you can use the noCleaning() method:

Model::orderBy('parent_id')->get()->noCleaning()->nest();
You can’t perform that action at this time.