Modified Pre-order Tree Traversal doctrine implementation.
http://www.sitepoint.com/series/storing-hierarchical-data-in-a-database/
Full list of dependencies you can get from Composer config file
The best way to install Kappa\DoctrineMPTT is using Composer
$ composer require kappa/doctrine-mptt:@dev
and register extension
extensions:
doctrine: Kappa\Doctrine\DI\DoctrineExtension
doctrineMPTT: Kappa\DoctrineMPTT\DI\DoctrineMPTTExtension
- Minimize count of queries. For delete is needed 3 queries (1x
DELETE
, 2xUPDATE
), for create is needed 3 queries (1xINSERT
, 2xUPDATE
) and for move item is needed only 1xUPDATE
query. This algorithm is much faster and more fuel efficient than other commonly used methods, such as classical parent - children method. - Full control over the nesting depth or count of branches
- This package was be tested on MySQL, SQLite and PostgreSQL and it is compatible with them
- Because this package is working directly with database to minimize count of queries after use
moveItem()
orinsertItem()
you should refresh loaded entities. Attention! you must save all updates before call this methods to avoids conflicts
You can set custom names for used columns:
doctrineMPTT:
entityClass: Your\entity
originalLeftName: _lft
leftColumnName: lft
rightColumnName: rgt
depthColumnName: depth
Configuration may not be in config file but can be set Kappa\DoctrineMPTT\TraversableManager::setConfigurator
.
Package provide main Kappa\DoctrineMPTT\TraversableManager
which can be used for all manipulations.
All operations are performed over entity which is instance of Kappa\DoctrineMPTT\Entities\TraversableInterface
.
You can use own entity but, your entity must implement Kappa\DoctrineMPTT\Entities\TraversableInterface
interface.
For easier implementation you can use Kappa\DoctrineMPTT\Entities\Traversable
trait which implements all
requires methods and columns.
Original tree structure
Kappa\DoctrineMPTT\TraversableManager
provides three methods by which we can do all operations.
insertItem(TraversableInterface $actual, TraversableInterface $parent = null, $refresh)
Second argument is new parent and actual item (first argument) will be included under this parent item.
Last argument is bool and if is set to true
entities will be refreshed. For example: This code generate
next tree
$parent = $this->repository->find(4);
$actual = new TraversableEntity();
// ....
$this->traversableManager->insertItem($parent, $actual);
If is parent null, actual item will be inserted as last child of root element if it exist. If not exist root element actual item will be inserted as root.
moveItem(TraversableInterface $actual, TraversableInterface $related, action, refresh)
With this method you can move each item into new place (as predecessor or descendant).
Last argument is bool and if is set to true
entities will be refreshed.
For example predecessor
// (1)
$actual = $this->repository->find(3);
$related = $this->repository->find(2);
$this->traversableManager->moveItem($actual, $related, TraversableManager::PREDECESSOR); // (1) - move actual before related
// (2)
$actual = $this->repository->find(3);
$related = $this->repository->find(4);
$this->traversableManager->moveItem($actual, $related, TraversableManager::DESCENDANT); // (2) - move actual as child of related
// (3)
$actual = $this->repository->find(3);
$this->traversableManager->moveItem($actual, null, TraversableManager::DESCENDANT); // (3) - move actual as last child of root
(1) Result
(2) Result
(3) Result
removeItem(TraversableInterface $actual)
Remove item and all its children For example:
$actual = $this->repository->find(2);
$this->traversableManager->removeItem($actual);
Kappa\DoctrineMPTT\Queries\Objects\Selectors\GetAll
- returns all items sorted for scalable listingKappa\DoctrineMPTT\Queries\Objects\Selectors\GetParents
- returns all parents for actual itemKappa\DoctrineMPTT\Queries\Objects\Selectors\GetChildren
- returns all children for actual itemKappa\DoctrineMPTT\Queries\Objects\Selectors\GetPrevious
- return previous itemKappa\DoctrineMPTT\Queries\Objects\Selectors\GetNext
- return next itemKappa\DoctrineMPTT\Queries\Objects\Selectors\GetParent
- returns parent itemKappa\DoctrineMPTT\Queries\Objects\Selectors\GetRoot
- returns tree root
You can use Kappa\DoctrineMPTT\Queries\SelectorsCollector
as easier getter of query objects