����JFIF��x�x����'
| Server IP : 78.140.185.180 / Your IP : 216.73.216.170 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /proc/1630575/root/proc/1630575/root/home/builderbox/././www/vendor/laravel/scout/src/ |
Upload File : |
<?php
namespace Laravel\Scout;
use Illuminate\Container\Container;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Traits\Macroable;
class Builder
{
use Macroable;
/**
* The model instance.
*
* @var \Illuminate\Database\Eloquent\Model
*/
public $model;
/**
* The query expression.
*
* @var string
*/
public $query;
/**
* Optional callback before search execution.
*
* @var \Closure|null
*/
public $callback;
/**
* Optional callback before model query execution.
*
* @var \Closure|null
*/
public $queryCallback;
/**
* The custom index specified for the search.
*
* @var string
*/
public $index;
/**
* The "where" constraints added to the query.
*
* @var array
*/
public $wheres = [];
/**
* The "where in" constraints added to the query.
*
* @var array
*/
public $whereIns = [];
/**
* The "limit" that should be applied to the search.
*
* @var int
*/
public $limit;
/**
* The "order" that should be applied to the search.
*
* @var array
*/
public $orders = [];
/**
* Create a new search builder instance.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $query
* @param \Closure|null $callback
* @param bool $softDelete
* @return void
*/
public function __construct($model, $query, $callback = null, $softDelete = false)
{
$this->model = $model;
$this->query = $query;
$this->callback = $callback;
if ($softDelete) {
$this->wheres['__soft_deleted'] = 0;
}
}
/**
* Specify a custom index to perform this search on.
*
* @param string $index
* @return $this
*/
public function within($index)
{
$this->index = $index;
return $this;
}
/**
* Add a constraint to the search query.
*
* @param string $field
* @param mixed $value
* @return $this
*/
public function where($field, $value)
{
$this->wheres[$field] = $value;
return $this;
}
/**
* Add a "where in" constraint to the search query.
*
* @param string $field
* @param array $values
* @return $this
*/
public function whereIn($field, array $values)
{
$this->whereIns[$field] = $values;
return $this;
}
/**
* Include soft deleted records in the results.
*
* @return $this
*/
public function withTrashed()
{
unset($this->wheres['__soft_deleted']);
return $this;
}
/**
* Include only soft deleted records in the results.
*
* @return $this
*/
public function onlyTrashed()
{
return tap($this->withTrashed(), function () {
$this->wheres['__soft_deleted'] = 1;
});
}
/**
* Set the "limit" for the search query.
*
* @param int $limit
* @return $this
*/
public function take($limit)
{
$this->limit = $limit;
return $this;
}
/**
* Add an "order" for the search query.
*
* @param string $column
* @param string $direction
* @return $this
*/
public function orderBy($column, $direction = 'asc')
{
$this->orders[] = [
'column' => $column,
'direction' => strtolower($direction) == 'asc' ? 'asc' : 'desc',
];
return $this;
}
/**
* Apply the callback's query changes if the given "value" is true.
*
* @param mixed $value
* @param callable $callback
* @param callable $default
* @return mixed
*/
public function when($value, $callback, $default = null)
{
if ($value) {
return $callback($this, $value) ?: $this;
} elseif ($default) {
return $default($this, $value) ?: $this;
}
return $this;
}
/**
* Pass the query to a given callback.
*
* @param \Closure $callback
* @return $this
*/
public function tap($callback)
{
return $this->when(true, $callback);
}
/**
* Set the callback that should have an opportunity to modify the database query.
*
* @param callable $callback
* @return $this
*/
public function query($callback)
{
$this->queryCallback = $callback;
return $this;
}
/**
* Get the raw results of the search.
*
* @return mixed
*/
public function raw()
{
return $this->engine()->search($this);
}
/**
* Get the keys of search results.
*
* @return \Illuminate\Support\Collection
*/
public function keys()
{
return $this->engine()->keys($this);
}
/**
* Get the first result from the search.
*
* @return \Illuminate\Database\Eloquent\Model
*/
public function first()
{
return $this->get()->first();
}
/**
* Get the results of the search.
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public function get()
{
return $this->engine()->get($this);
}
/**
* Get the results of the search as a "lazy collection" instance.
*
* @return \Illuminate\Support\LazyCollection
*/
public function cursor()
{
return $this->engine()->cursor($this);
}
/**
* Paginate the given query into a simple paginator.
*
* @param int $perPage
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\Paginator
*/
public function simplePaginate($perPage = null, $pageName = 'page', $page = null)
{
$engine = $this->engine();
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$results = $this->model->newCollection($engine->map(
$this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model
)->all());
$hasMorePages = ($perPage * $page) < $engine->getTotalCount($rawResults);
$paginator = Container::getInstance()->makeWith(Paginator::class, [
'items' => $results,
'perPage' => $perPage,
'currentPage' => $page,
'options' => [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
],
])->hasMorePagesWhen($hasMorePages);
return $paginator->appends('query', $this->query);
}
/**
* Paginate the given query into a paginator.
*
* @param int $perPage
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function paginate($perPage = null, $pageName = 'page', $page = null)
{
$engine = $this->engine();
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$results = $this->model->newCollection($engine->map(
$this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model
)->all());
$paginator = Container::getInstance()->makeWith(LengthAwarePaginator::class, [
'items' => $results,
'total' => $this->getTotalCount($rawResults),
'perPage' => $perPage,
'currentPage' => $page,
'options' => [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
],
]);
return $paginator->appends('query', $this->query);
}
/**
* Paginate the given query into a simple paginator with raw data.
*
* @param int $perPage
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function paginateRaw($perPage = null, $pageName = 'page', $page = null)
{
$engine = $this->engine();
$page = $page ?: Paginator::resolveCurrentPage($pageName);
$perPage = $perPage ?: $this->model->getPerPage();
$results = $engine->paginate($this, $perPage, $page);
$paginator = Container::getInstance()->makeWith(LengthAwarePaginator::class, [
'items' => $results,
'total' => $this->getTotalCount($results),
'perPage' => $perPage,
'currentPage' => $page,
'options' => [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
],
]);
return $paginator->appends('query', $this->query);
}
/**
* Get the total number of results from the Scout engine, or fallback to query builder.
*
* @param mixed $results
* @return int
*/
protected function getTotalCount($results)
{
$engine = $this->engine();
$totalCount = $engine->getTotalCount($results);
if (is_null($this->queryCallback)) {
return $totalCount;
}
$ids = $engine->mapIds($results)->all();
if (count($ids) < $totalCount) {
$ids = $engine->keys(tap(clone $this, function ($builder) use ($totalCount) {
$builder->take(
is_null($this->limit) ? $totalCount : min($this->limit, $totalCount)
);
}))->all();
}
return $this->model->queryScoutModelsByIds(
$this, $ids
)->toBase()->getCountForPagination();
}
/**
* Get the engine that should handle the query.
*
* @return mixed
*/
protected function engine()
{
return $this->model->searchableUsing();
}
}