/** * DescendantsRelation constructor. * * @param QueryBuilder $builder * @param Model $model */ public function __construct(QueryBuilder $builder, Model $model) { if (!NestedSet::isNode($model)) { throw new InvalidArgumentException('Model must be node.'); } parent::__construct($builder, $model); }
/** * @param mixed $root * * @return int */ protected function getRootNodeId($root = false) { if (NestedSet::isNode($root)) { return $root->getKey(); } if ($root !== false) { return $root; } // If root node is not specified we take parent id of node with // least lft value as root node id. $leastValue = null; /** @var Model|NodeTrait $node */ foreach ($this->items as $node) { if ($leastValue === null || $node->getLft() < $leastValue) { $leastValue = $node->getLft(); $root = $node->getParentId(); } } return $root; }
/** * @param $id * @param $operator * @param $boolean * * @return $this */ protected function whereIsBeforeOrAfter($id, $operator, $boolean) { if (NestedSet::isNode($id)) { $value = '?'; $this->query->addBinding($id->getLft()); } else { $valueQuery = $this->model->newQuery()->toBase()->select('_n.' . $this->model->getLftName())->from($this->model->getTable() . ' as _n')->where('_n.' . $this->model->getKeyName(), '=', $id); $this->query->mergeBindings($valueQuery); $value = '(' . $valueQuery->toSql() . ')'; } list($lft, ) = $this->wrappedColumns(); $this->query->whereRaw("{$lft} {$operator} {$value}", [], $boolean); return $this; }