Convert your model data from SimpleTree to NestedTree
Few time a project start small and grow after, this rule is also true for model tree : on the beginning a SimpleTree (parent and child) is fine. But after you need to perform action on a branch and need to convert your model from SimpleTree to a NestedTree and fill nest_left
, nest_right
and nest_depth
columns. With the follwing code you will can do that simply.
- Ensure the following fields exist in your table :
parent_id
,nest_left
,nest_right
andnest_depth
for more info read official documentation - Copy code below in a custom route file or in a Console command :
/*
* This script migrate model data from SimpleTree to NestedTree
*
* @see \October\Rain\Database\Traits\SimpleTree
* @see \October\Rain\Database\Traits\NestedTree
*
* Before executing this ensure that your model implement SimpleTree
* and switch to NestedTree only when the process is complete
*/
function buildNestedTree($items, $level, &$nest)
{
$items->each(function ($item) use (&$nest, $level) {
$item->nest_left = $nest++;
$item->nest_depth = $level;
$children = $item->getChildren();
buildNestedTree($children, $level + 1, $nest);
$item->nest_right = $nest++;
$item->save();
});
}
// Your model that implement \October\Rain\Database\Traits\SimpleTree
$model = new \VendorCode\PluginName\Models\YourModel();
$level = 0;
$nest = 1;
$roots = $model->whereNull($model->getParentColumnName())->get();
// Build the Tree from parents and goes down gradually
buildNestedTree($roots, $level, $nest);
- Once the process is done you can replace the SimpleTree trait by NestedTree and (if everything went well) use the power of NestedTree
Posted in OctoberCMS on Feb 05, 2018