File: D:/HostingSpaces/SBogers10/blije-gasten.komma.pro/vendor/laravel/scout/src/Builder.php
<?php
namespace Laravel\Scout;
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 string
*/
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 "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 $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;
}
/**
* 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);
}
/**
* Paginate the given query into a simple 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 = (new LengthAwarePaginator($results, $engine->getTotalCount($rawResults), $perPage, $page, [
'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 = (new LengthAwarePaginator($results, $engine->getTotalCount($results), $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]));
return $paginator->appends('query', $this->query);
}
/**
* Get the engine that should handle the query.
*
* @return mixed
*/
protected function engine()
{
return $this->model->searchableUsing();
}
}