예제 #1
0
 /**
  * Validates bounds of the nested tree structure. It will perform checks on
  * the `lft`, `rgt` and `parent_id` columns. Mainly that they're not null,
  * rights greater than lefts, and that they're within the bounds of the parent.
  *
  * @return boolean
  */
 protected function validateBounds()
 {
     $connection = $this->node->getConnection();
     $grammar = $connection->getQueryGrammar();
     $tableName = $this->node->getTable();
     $primaryKeyName = $this->node->getKeyName();
     $parentColumn = $this->node->getQualifiedParentColumnName();
     $lftCol = $grammar->wrap($this->node->getLeftColumnName());
     $rgtCol = $grammar->wrap($this->node->getRightColumnName());
     $qualifiedLftCol = $grammar->wrap($this->node->getQualifiedLeftColumnName());
     $qualifiedRgtCol = $grammar->wrap($this->node->getQualifiedRightColumnName());
     $qualifiedParentCol = $grammar->wrap($this->node->getQualifiedParentColumnName());
     $whereStm = "({$qualifiedLftCol} IS NULL OR\n      {$qualifiedRgtCol} IS NULL OR\n      {$qualifiedLftCol} >= {$qualifiedRgtCol} OR\n      ({$qualifiedParentCol} IS NOT NULL AND\n        ({$qualifiedLftCol} <= parent.{$lftCol} OR\n          {$qualifiedRgtCol} >= parent.{$rgtCol})))";
     $query = $this->node->newQuery()->join($connection->raw($grammar->wrapTable($tableName) . ' AS parent'), $parentColumn, '=', $connection->raw('parent.' . $grammar->wrap($primaryKeyName)), 'left outer')->whereRaw($whereStm);
     return $query->count() == 0;
 }
예제 #2
0
 /**
  * Applies a lock to the rows between the supplied index boundaries.
  *
  * @param   int   $lft
  * @param   int   $rgt
  * @return  void
  */
 protected function applyLockBetween($lft, $rgt)
 {
     $this->node->newQuery()->where($this->node->getLeftColumnName(), '>=', $lft)->where($this->node->getRightColumnName(), '<=', $rgt)->select($this->node->getKeyName())->lockForUpdate()->get();
 }