PHPackages                             bupy7/doctrine-nested-set - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. bupy7/doctrine-nested-set

AbandonedArchivedLibrary[Database &amp; ORM](/categories/database)

bupy7/doctrine-nested-set
=========================

Nested sets for Doctrine ORM

3.0.0(5y ago)24.2k1BSD-3-ClausePHPPHP ^7.1 || ^8.0

Since Jun 4Pushed 5y ago1 watchersCompare

[ Source](https://github.com/bupy7/doctrine-nested-set)[ Packagist](https://packagist.org/packages/bupy7/doctrine-nested-set)[ RSS](/packages/bupy7-doctrine-nested-set/feed)WikiDiscussions master Synced today

READMEChangelog (5)Dependencies (5)Versions (6)Used By (0)

doctrine-nested-set
===================

[](#doctrine-nested-set)

[![Latest Stable Version](https://camo.githubusercontent.com/cf6c78fbd0d4bc89b9fb76f795caade1e5cb54f87042e0c0ed897d35e00500a9/68747470733a2f2f706f7365722e707567782e6f72672f62757079372f646f637472696e652d6e65737465642d7365742f762f737461626c65)](https://packagist.org/packages/bupy7/doctrine-nested-set)[![Total Downloads](https://camo.githubusercontent.com/e0313485e6364cd75c940b69036b933ebf4e7b5d2f8f7d5d26dd911f41c8c9c1/68747470733a2f2f706f7365722e707567782e6f72672f62757079372f646f637472696e652d6e65737465642d7365742f646f776e6c6f616473)](https://packagist.org/packages/bupy7/doctrine-nested-set)[![Latest Unstable Version](https://camo.githubusercontent.com/cf4a6e74b6bbe2d13c40f02e2ad17a5600fa43dca55aa364f449785cc6fcea60/68747470733a2f2f706f7365722e707567782e6f72672f62757079372f646f637472696e652d6e65737465642d7365742f762f756e737461626c65)](https://packagist.org/packages/bupy7/doctrine-nested-set)[![License](https://camo.githubusercontent.com/55ae9ca8783513e6cbcb5dd77fbb978f68aa6fbd149930352c81f3b0893acccc/68747470733a2f2f706f7365722e707567782e6f72672f62757079372f646f637472696e652d6e65737465642d7365742f6c6963656e7365)](https://packagist.org/packages/bupy7/doctrine-nested-set)[![Build Status](https://camo.githubusercontent.com/8024e34bd7647c2ec690ddd4514b2ddc8963b7404ac75de33ca8f35e7d411f19/68747470733a2f2f7472617669732d63692e6f72672f62757079372f646f637472696e652d6e65737465642d7365742e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/bupy7/doctrine-nested-set)[![Coverage Status](https://camo.githubusercontent.com/fe7d63b0e119a6d3504b6d527e4bc4cecd1521c1f48c4cf06ed36ab58ea277ad/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f62757079372f646f637472696e652d6e65737465642d7365742f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/bupy7/doctrine-nested-set?branch=master)

Library for Doctrine ORM releasing [the nested set model tree](https://en.wikipedia.org/wiki/Nested_set_model).

Features
--------

[](#features)

- Multiple roots.
- Fetching all items.
- Fething children items.
- Fething descendant items.
- Fething a parent item.
- Fething root items.
- Fething ancestor items.
- Adding as last of some item.
- Adding as first of some item.
- TODO: Adding after some item.
- TODO: Adding before some item.
- Adding as a first root item.
- Adding as a last root item.
- Removing a item.
- TODO: Moving item after some item.
- TODO: Moving item before some item.
- TODO: Making as root item.
- TODO: Making as a child item of some parent item.

Install
-------

[](#install)

The preferred way to install this extension is through [composer](https://getcomposer.org/download/).

```
$ composer require bupy7/doctrine-nested-set "*"

```

Configuration
-------------

[](#configuration)

#### Add entity

[](#add-entity)

```
use Bupy7\Doctrine\NestedSet\NestedSetInterface;

/**
 * @Entity(repositoryClass="CategoryRepository")
 */
class Category implements NestedSetInterface
{
    /**
     * @Id
     * @Column(type="integer")
     * @GeneratedValue
     * @var int|null
     */
    private $id;
    /**
     * @Column(type="integer", name="root_key")
     * @var int
     */
    private $rootKey = 1;
    /**
     * @Column(type="integer")
     * @var int
     */
    private $level = 1;
    /**
     * @Column(type="integer", name="left_key")
     * @var int
     */
    private $leftKey;
    /**
     * @Column(type="integer", name="right_key")
     * @var int
     */
    private $rightKey;
    /**
     * @Column(type="string")
     * @var string
     */
    private $name;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setId($id): NestedSetInterface
    {
        $this->id = $id;
        return $this;
    }

    public function getRootKey(): int
    {
        return $this->rootKey;
    }

    public function setRootKey(int $rootKey): NestedSetInterface
    {
        $this->rootKey = $rootKey;
        return $this;
    }

    public function getLevel(): int
    {
        return $this->level;
    }

    public function setLevel(int $level): NestedSetInterface
    {
        $this->level = $level;
        return $this;
    }

    public function getLeftKey(): int
    {
        return $this->leftKey;
    }

    public function setLeftKey(int $leftKey): NestedSetInterface
    {
        $this->leftKey = $leftKey;
        return $this;
    }

    public function getRightKey(): int
    {
        return $this->rightKey;
    }

    public function setRightKey(int $rightKey): NestedSetInterface
    {
        $this->rightKey = $rightKey;
        return $this;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): Category
    {
        $this->name = $name;
        return $this;
    }
}
```

#### Add repository

[](#add-repository)

```
use Bupy7\Doctrine\NestedSet\NestedSetRepositoryAbstract;

class CategoryRepository extends NestedSetRepositoryAbstract
{
}
```

Usage
-----

[](#usage)

**Tree example:**

```
- PC
- - Motherboards
- - RAM
- - - DDR3
- - - DDR4
- - CPU
- Laptops
- Tablets

```

#### Fetching all items

[](#fetching-all-items)

```
$categories = $categoryRepository->findAll();

// var_dump($categories);
//
// - PC
// - Motherboards
// - RAM
// - DDR3
// - DDR4
// - CPU
// - Laptops
// - Tablets
```

#### Fething children items

[](#fething-children-items)

```
$parentCategory = $categoryRepository->findOneByName('RAM');
$children = $categoryRepository->findChildren($parentCategory);

// var_dump($children);
//
// - DDR3
// - DDR4
```

#### Fething descendant items

[](#fething-descendant-items)

```
$parentCategory = $categoryRepository->findOneByName('PC');
$descendants = $categoryRepository->findDescendants($parentCategory);

// var_dump($children);
//
// - Motherboards
// - RAM
// - DDR3
// - DDR4
// - CPU
```

#### Fething a parent item

[](#fething-a-parent-item)

```
$childrenCategory = $categoryRepository->findOneByName('RAM');
$parent = $categoryRepository->findOneParent($childrenCategory);

// var_dump($parent);
//
// - PC
```

#### Fething root items

[](#fething-root-items)

```
$roots = $categoryRepository->findRoots();

// var_dump($parent);
//
// - PC
// - Laptops
// - Tablets
```

#### Fething ancestor items

[](#fething-ancestor-items)

```
$childrenCategory = $categoryRepository->findOneByName('DDR3');
$roots = $categoryRepository->findAncestors($childrenCategory);

// var_dump($parent);
//
// - RAM
// - PC
```

#### Adding as first of some item

[](#adding-as-first-of-some-item)

```
$category = new Category();
$category->setName('DDR2');

$parentCategory = $categoryRepository->findOneByName('RAM');
$categoryRepository->prepend($category, $parentCategory);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- PC
- - Motherboards
- - RAM
- - - DDR2
- - - DDR3
- - - DDR4
- - CPU
- Laptops
- Tablets

```

#### Adding as last of some item

[](#adding-as-last-of-some-item)

```
$category = new Category();
$category->setName('LGA 1151v2');

$parentCategory = $categoryRepository->findOneByName('CPU');
$categoryRepository->append($category, $parentCategory);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- PC
- - Motherboards
- - RAM
- - - DDR3
- - - DDR4
- - CPU
- - - LGA 1151v2
- Laptops
- Tablets

```

#### Adding as a first root item

[](#adding-as-a-first-root-item)

```
$category = new Category();
$category->setName('Phones');

$categoryRepository->prepend($category);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- Phones
- PC
- - Motherboards
- - RAM
- - - DDR3
- - - DDR4
- - CPU
- Laptops
- Tablets

```

#### Adding as a last root item

[](#adding-as-a-last-root-item)

```
$category = new Category();
$category->setName('Phones');

$categoryRepository->append($category);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- PC
- - Motherboards
- - RAM
- - - DDR3
- - - DDR4
- - CPU
- Laptops
- Tablets
- Phones

```

#### Removing a item

[](#removing-a-item)

```
$category = $categoryRepository->findOneByName('CPU');
$categoryRepository->remove($category);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- PC
- - Motherboards
- - RAM
- - - DDR3
- - - DDR4
- Laptops
- Tablets

```

or remove with descendants:

```
$category = $categoryRepository->findOneByName('PC');
$categoryRepository->remove($category);
$entityManager->clear(); // optional, if you need
```

Result of tree:

```
- Laptops
- Tablets

```

#### You may use transactions when it needs manually

[](#you-may-use-transactions-when-it-needs-manually)

```
use Doctrine\DBAL\TransactionIsolationLevel;

// if you want to change isolation level
// $oldIsolationLevel = $entityManager->getConnection()->getTransactionIsolation();
// $entityManager->getConnection()->setTransactionIsolation(TransactionIsolationLevel::SERIALIZABLE);

$entityManager->beginTransaction();
try {
    $category = $categoryRepository->findOneByName('PC');
    $categoryRepository->remove($category);
    $entityManager->commit();
    $entityManager->clear(); // optional, if you need
} catch (Exception $e) {
    $entityManager->rollback();
    throw $e;
} finally {
    // if you changed isolation level
    // $entityManager->getConnection()->setTransactionIsolation($oldIsolationLevel);
}
```

License
-------

[](#license)

doctrine-nested-set is released under the BSD 3-Clause License.

###  Health Score

34

—

LowBetter than 75% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity25

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity68

Established project with proven stability

 Bus Factor1

Top contributor holds 97.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~169 days

Total

5

Last Release

1907d ago

Major Versions

1.0.1 → 2.0.02021-03-31

2.1.0 → 3.0.02021-04-13

PHP version history (2 changes)1.0.0PHP ^7.1

2.1.0PHP ^7.1 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/f2f9ee20b742a44db8870955cd27b91bb82c14e08dd61a4e096692c9d9d83302?d=identicon)[bupy7](/maintainers/bupy7)

---

Top Contributors

[![bupy7](https://avatars.githubusercontent.com/u/5145037?v=4)](https://github.com/bupy7 "bupy7 (42 commits)")[![nepster-web](https://avatars.githubusercontent.com/u/5681979?v=4)](https://github.com/nepster-web "nepster-web (1 commits)")

---

Tags

phpnesteddatabaseormdoctrinedbtreerootsmultiplesets

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/bupy7-doctrine-nested-set/health.svg)

```
[![Health](https://phpackages.com/badges/bupy7-doctrine-nested-set/health.svg)](https://phpackages.com/packages/bupy7-doctrine-nested-set)
```

###  Alternatives

[scienta/doctrine-json-functions

A set of extensions to Doctrine that add support for json query functions.

58825.9M54](/packages/scienta-doctrine-json-functions)[rcsofttech/audit-trail-bundle

Enterprise-grade, high-performance Symfony audit trail bundle. Automatically track Doctrine entity changes with split-phase architecture, multiple transports (HTTP, Queue, Doctrine), and sensitive data masking.

1189.8k](/packages/rcsofttech-audit-trail-bundle)[api-platform/doctrine-orm

Doctrine ORM bridge

294.4M92](/packages/api-platform-doctrine-orm)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
