public function moveNode($key, $position)
    {
        list($lft, $rgt) = $this->model->newNestedSetQuery()
                                       ->getPlainNodeData($key, TRUE);

        if ($lft < $position && $position <= $rgt) {
            throw new LogicException('Cannot move node into itself.');
        }

        // Get boundaries of nodes that should be moved to new position
        $from = min($lft, $position);
        $to = max($rgt, $position - 1);

        // The height of node that is being moved
        $height = $rgt - $lft + 1;

        // The distance that our node will travel to reach it's destination
        $distance = $to - $from + 1 - $height;

        // If no distance to travel, just return
        if ($distance === 0) {
            return 0;
        }

        if ($position > $lft) {
            $height *= -1;
        }
        else {
            $distance *= -1;
        }

        $params = compact('lft', 'rgt', 'from', 'to', 'height', 'distance');

        $boundary = [$from, $to];

        $query = $this->toBase()->where(function (Query $inner) use ($boundary) {
            $inner->whereBetween($this->model->getLftName(), $boundary);
            $inner->orWhereBetween($this->model->getRgtName(), $boundary);
        });

        return $query->update($this->patch($params));
    }
public function moveNode($key, $position)
    {
        list($lft, $rgt) = $this->model->newNestedSetQuery()
                                       ->getPlainNodeData($key, TRUE);

        if ($lft < $position && $position <= $rgt) {
            throw new LogicException('Cannot move node into itself.');
        }

        // Get boundaries of nodes that should be moved to new position
        $from = min($lft, $position);
        $to = max($rgt, $position - 1);

        // The height of node that is being moved
        $height = $rgt - $lft + 1;

        // The distance that our node will travel to reach it's destination
        $distance = $to - $from + 1 - $height;

        // If no distance to travel, just return
        if ($distance === 0) {
            return 0;
        }

        if ($position > $lft) {
            $height *= -1;
        }
        else {
            $distance *= -1;
        }

        $params = compact('lft', 'rgt', 'from', 'to', 'height', 'distance');

        $boundary = [$from, $to];

        $query = $this->toBase()->where(function (Query $inner) use ($boundary) {
            $inner->whereBetween($this->model->getLftName(), $boundary);
            $inner->orWhereBetween($this->model->getRgtName(), $boundary);
        });

        return $query->update($this->patch($params));
    }
public function moveNode ( $ key , $ position ) { list ( $ lft , $ rgt ) = $ this -> model -> newNestedSetQuery ( ) -> getPlainNodeData ( $ key , TRUE ) ; if ( $ lft < $ position && $ position <= $ rgt ) { throw new LogicException ( 'Cannot move node into itself.' ) ; } // Get boundaries of nodes that should be moved to new position $ from = min ( $ lft , $ position ) ; $ to = max ( $ rgt , $ position - 1 ) ; // The height of node that is being moved $ height = $ rgt - $ lft + 1 ; // The distance that our node will travel to reach it's destination $ distance = $ to - $ from + 1 - $ height ; // If no distance to travel, just return if ( $ distance === 0 ) { return 0 ; } if ( $ position > $ lft ) { $ height *= - 1 ; } else { $ distance *= - 1 ; } $ params = compact ( 'lft' , 'rgt' , 'from' , 'to' , 'height' , 'distance' ) ; $ boundary = [ $ from , $ to ] ; $ query = $ this -> toBase ( ) -> where ( function ( Query $ inner ) use ( $ boundary ) { $ inner -> whereBetween ( $ this -> model -> getLftName ( ) , $ boundary ) ; $ inner -> orWhereBetween ( $ this -> model -> getRgtName ( ) , $ boundary ) ; } ) ; return $ query -> update ( $ this -> patch ( $ params ) ) ; }
Move a node to the new position.

@param mixed $key
@param int $position

@return int
Move a node to the new position .