74 lines
2.1 KiB
PHP
74 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\PluginResource;
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Collection;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Pagination\Paginator;
|
|
|
|
class CollectionEloquentBuilder extends Builder
|
|
{
|
|
protected $collection;
|
|
|
|
public function __construct($query)
|
|
{
|
|
parent::__construct($query);
|
|
$this->collection = new Collection(); // Initialize with an empty collection
|
|
}
|
|
|
|
public function setCollection(Collection $collection)
|
|
{
|
|
$this->collection = $collection;
|
|
return $this;
|
|
}
|
|
|
|
public function get($columns = ['*'])
|
|
{
|
|
return $this->collection;
|
|
}
|
|
|
|
public function find($id, $columns = ['*'])
|
|
{
|
|
return $this->collection->firstWhere('id', $id);
|
|
}
|
|
|
|
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null, $total = null)
|
|
{
|
|
$page = $page ?: Paginator::resolveCurrentPage($pageName);
|
|
|
|
$results = $this->collection->slice(($page - 1) * $perPage, $perPage)->all();
|
|
|
|
return new LengthAwarePaginator($results, $this->collection->count(), $perPage, $page, [
|
|
'path' => Paginator::resolveCurrentPath(),
|
|
'pageName' => $pageName,
|
|
]);
|
|
}
|
|
|
|
public function count($columns = '*')
|
|
{
|
|
return $this->collection->count();
|
|
}
|
|
|
|
public function where($column, $operator = null, $value = null, $boolean = 'and')
|
|
{
|
|
if (func_num_args() === 2) {
|
|
[$value, $operator] = [$operator, '='];
|
|
}
|
|
|
|
if ($operator === '=') {
|
|
$this->collection = $this->collection->where($column, $value);
|
|
} else {
|
|
// For simplicity, only handling '=' operator for now. More complex operators would require more logic.
|
|
// For example, for 'like', you'd need to implement string matching.
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function orderBy($column, $direction = 'asc')
|
|
{
|
|
$this->collection = $this->collection->sortBy($column, SORT_REGULAR, $direction === 'desc');
|
|
return $this;
|
|
}
|
|
} |