/** * @param EloquentBuilder $query * @param EloquentBuilder $parent * @param array $columns * * @return mixed */ public function getRelationQuery(EloquentBuilder $query, EloquentBuilder $parent, $columns = ['*']) { $query->select($columns); $table = $query->getModel()->getTable(); $query->from($table . ' as ' . ($hash = $this->getRelationCountHash())); $grammar = $query->getQuery()->getGrammar(); $table = $grammar->wrapTable($table); $hash = $grammar->wrapTable($hash); $lft = $grammar->wrap($this->parent->getLftName()); $rgt = $grammar->wrap($this->parent->getRgtName()); return $query->whereRaw("{$hash}.{$lft} between {$table}.{$lft} + 1 and {$table}.{$rgt}"); }
/** * Fixes the tree based on parentage info. * * Nodes with invalid parent are saved as roots. * * @return int The number of fixed nodes */ public function fixTree() { $columns = [$this->model->getKeyName(), $this->model->getParentIdName(), $this->model->getLftName(), $this->model->getRgtName()]; $dictionary = $this->model->newNestedSetQuery()->defaultOrder()->get($columns)->groupBy($this->model->getParentIdName())->all(); return self::fixNodes($dictionary); }