Installation:
composer require trilote/baum
Publish the migration (if needed) and run it:
php artisan vendor:publish --provider="Trilote\Baum\BaumServiceProvider" --tag=migrations
php artisan migrate
Model Integration:
Use the Trilote\Baum\NodeTrait in your Eloquent model:
use Trilote\Baum\NodeTrait;
class Category extends Model
{
use NodeTrait;
protected $table = 'categories';
}
First Use Case: Create a root node and its children:
$electronics = Category::create(['name' => 'Electronics']);
$phones = $electronics->appendChild(['name' => 'Phones']);
$laptops = $electronics->appendChild(['name' => 'Laptops']);
Tree Construction:
appendChild() to add nodes hierarchically.prependChild() to insert before siblings.insertAfter()/insertBefore() for reordering siblings.Querying:
$electronics->descendantsAndSelf;
$electronics->children;
$phones->ancestorsAndSelf;
Reordering:
$laptops->moveTo($electronics, 'last-child');
$phones->swapWith($laptops);
Deletion:
$electronics->delete();
$electronics->delete(['with' => false]);
scopeDescendants() or scopeAncestors() in models for reusable queries.toTree() or toFlat() for frontend consumption.baum.node.created, baum.node.deleted, etc., for side effects.Performance:
lft/rgt.Data Integrity:
lft/rgt columns—use Baum’s methods.with => false cascades deletes (use transactions for safety).Edge Cases:
if ($node->parent_id !== $newParent->id) {
$node->moveTo($newParent);
}
\DB::enableQueryLog()) to inspect complex Baum queries.isValid() to check tree consistency after manual DB changes.baum:seed Artisan command to generate sample trees.Custom Scopes:
public function scopeActive($query)
{
return $query->where('active', true)->descendantsAndSelf();
}
Override Defaults:
lft/rgt column names in baum.php config.NodeTrait for custom tree logic (e.g., validation).Artisan Commands:
baum:prune to clean up orphaned nodes.lft/rgt columns are indexed for performance.deleted_at is nullable in migrations.morphTo and custom logic.How can I help you explore Laravel packages today?