2023-01-02 16:29:05 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Support;
|
|
|
|
use Laravel\Scout\Builder as ScoutBuilder;
|
2023-01-15 15:49:33 +00:00
|
|
|
use Illuminate\Contracts\Database\Query\Builder;
|
2024-02-13 18:38:00 +00:00
|
|
|
use Jenssegers\Mongodb\Eloquent\Builder as MongoDbBuilder;
|
2023-01-02 16:29:05 +00:00
|
|
|
|
|
|
|
class RepositoryQueryBase
|
|
|
|
{
|
2023-01-24 23:30:47 +00:00
|
|
|
private ?Builder $queryableBuilder = null;
|
|
|
|
private ?ScoutBuilder $searchableBuilder = null;
|
2023-01-02 16:29:05 +00:00
|
|
|
|
|
|
|
public function __construct(
|
|
|
|
private readonly \Closure $getQueryable,
|
|
|
|
private readonly \Closure $getSearchable)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2024-02-13 18:38:00 +00:00
|
|
|
protected function queryable(bool $createNew = false): Builder|MongoDbBuilder
|
2023-01-02 16:29:05 +00:00
|
|
|
{
|
|
|
|
if ($createNew) {
|
|
|
|
$callback = $this->getQueryable;
|
|
|
|
return $callback();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->queryableBuilder === null) {
|
|
|
|
$callback = $this->getQueryable;
|
|
|
|
$this->queryableBuilder = $callback();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->queryableBuilder;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function searchable(string $keywords, ?\Closure $callback = null, bool $createNew = false): ScoutBuilder
|
|
|
|
{
|
|
|
|
if ($createNew) {
|
|
|
|
$getSearchable = $this->getSearchable;
|
|
|
|
return $getSearchable($keywords, $callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->searchableBuilder === null) {
|
|
|
|
$getSearchable = $this->getSearchable;
|
|
|
|
$this->searchableBuilder = $getSearchable($keywords, $callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->searchableBuilder;
|
|
|
|
}
|
|
|
|
}
|