public function getItems($limit, $offset)
 {
     $builder = $this->query->getQuery();
     if ($builder->groups || $builder->unions) {
         $row = DB::selectOne("SELECT COUNT(*) qty FROM (" . $this->query->toSql() . ") sub", $this->query->getBindings());
         $total = (int) $row->qty;
     } else {
         $total = $this->query->count();
     }
     $pageOfItems = $this->query->skip($offset)->take($limit)->get();
     return [$pageOfItems, $total];
 }
Beispiel #2
0
 /**
  * Remove the scope from the given Eloquent query builder.
  *
  * @param \Illuminate\Database\Eloquent\Builder $builder
  */
 public function remove(Builder $builder)
 {
     $query = $builder->getQuery();
     $bindings = $builder->getBindings();
     foreach ((array) $query->wheres as $key => $where) {
         if ($where['column'] == $this->getDraftColumn($builder)) {
             unset($query->wheres[$key]);
             unset($bindings[$key]);
             $query->wheres = array_values($query->wheres);
         }
     }
     $query->setBindings($bindings);
 }
Beispiel #3
0
 /**
  * Get a preview of what query will be run from a query builder.
  *
  * This DOES NOT run the query so it can be used for debugging potentially memory-intensive queries.
  *
  * @param QueryBuilder $query
  * @return string
  */
 public static function getQueryPreview(QueryBuilder $query = null)
 {
     if (empty($query)) {
         return "";
     }
     $sql = str_replace('?', "'%s'", $query->toSql());
     $bindings = $query->getBindings();
     return vsprintf($sql, $bindings);
 }
Beispiel #4
0
 /**
  * Merge the "wheres" from a relation query to a has query.
  *
  * @param  \Illuminate\Database\Eloquent\Builder $hasQuery
  * @param  \Illuminate\Database\Eloquent\Relations\Relation $relation
  * @return void
  */
 protected function mergeModelDefinedRelationWheresToHasQuery(Builder $hasQuery, Relation $relation)
 {
     // Here we have the "has" query and the original relation. We need to copy over any
     // where clauses the developer may have put in the relationship function over to
     // the has query, and then copy the bindings from the "has" query to the main.
     $relationQuery = $relation->getBaseQuery();
     $hasQuery->mergeWheres($relationQuery->wheres, $relationQuery->getBindings());
     $this->query->addBinding($hasQuery->getBindings(), 'where');
 }
Beispiel #5
0
 /**
  * Generate a cache key
  *
  * @return string
  */
 public function generateCacheKey()
 {
     return md5($this->model->getConnectionName() . $this->builder->toSql() . serialize($this->builder->getBindings()));
 }
 /**
  * @param EloquentBuilder|QueryBuilder|Model $query
  * @param string $key
  * @param bool $returnExpression
  *
  * @return string
  */
 public function scopeToSubQuery($query, $key, $returnExpression = false)
 {
     $index = 0;
     $bindings = array();
     if (!Str::contains($key, '.')) {
         /** @var Model|BetterEloquentTrait $model */
         $model = $query->getModel();
         $key = $model->getField($key);
     }
     $sql = $query->select(array($key))->toSql();
     foreach ($query->getBindings() as $binding) {
         $bindings[] = is_array($binding) ? array_merge($bindings, $binding) : $binding;
     }
     while (Str::contains($sql, '?')) {
         $sql = $this->replaceFirst('?', $bindings[$index++], $sql);
     }
     $sql = "({$sql})";
     return $returnExpression ? new Expression($sql) : $sql;
 }