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]; }
/** * 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); }
/** * 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); }
/** * 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'); }
/** * 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; }