1. Go to this page and download the library: Download laragear/refine library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
laragear / refine example snippets
// https://myblog.com/posts/?author_id=10
use Illuminate\Support\Facades\Route;
Route::get('/posts', function (Request $request) {
return Post::refineBy(PostRefiner::class)->paginate()
});
class PostRefiner
{
public function authorId($query, $value)
{
$query->where('author_id', $value);
}
}
use App\Models\Post;
use Illuminate\Http\Request;
public function all(Request $request)
{
$request->validate([
'author_id' => 'sometimes|integer'
]);
$query = Post::query()->limit(10);
if ($request->has('author_id')) {
$query->where('author_id', $request->get('author_id'));
}
return $query->get();
}
use App\Models\Post;
use Illuminate\Http\Request;
use App\Http\Refiners\PostRefiner;
public function all(Request $request)
{
return Post::query()->refineBy(PostRefiner::class);
}
namespace App\Http\Refiners;
class PostRefiner
{
public function authorId($query, $value)
{
$query->where('author_id', $value);
}
}
namespace App\Http\Refiners;
use Laragear\Refine\Refiner;
class PostRefiner extends Refiner
{
/**
* Create a new post query filter instance.
*/
public function __construct()
{
//
}
}
// For `author_id=value`
public function authorId($query, mixed $value, Request $request)
{
// ...
}
namespace App\Http\Refiners;
use App\Models\Post;
use Illuminate\Http\Request;
use Laragear\Refine\Refiner;
class PostRefiner extends Refiner
{
public function authorId($query, mixed $value, Request $request)
{
// Only apply the filter if the user has permission to see all posts.
if ($request->user()->can('view any', Post::class)) {
$query->where('author_id', $value);
}
}
}
use Illuminate\Http\Request;
public function getKeys(Request $request): array
{
return [
'author_id',
'published_before',
'published_after',
];
}
use Illuminate\Http\Request;
use Illuminate\Foundation\Http\FormRequest;
public function getKeys(Request $request): array
{
if ($request instanceof FormRequest) {
return array_keys($request->validated());
}
return array_keys($request->keys());
}
public function getObligatoryKeys(): array
{
return ['order_by'];
}
public function orderBy($query, ?string $value, Request $request)
{
// If the value was not set, use the publishing timestamp as the column to sort.
$value ??= 'published_at'
$query->orderBy($value, $request->query('order') ?? 'asc');
}
namespace App\Http\Refiners;
use Illuminate\Contracts\Auth\Access\Gate;
use Laragear\Refine\Refiner;
use App\Models\Post;
class PostRefiner extends Refiner
{
public function __construct(protected Gate $gate)
{
//
}
public function authorId($query, $value)
{
if ($this->gate->check('view any', Post::class)) {
// ...
}
}
}
namespace App\Http\Refiners;
use Laragear\Refine\Contracts\ValidatesRefiner;
use Laragear\Refine\Refiner;
class PostRefiner extends Refiner implements ValidatesRefiner
{
// ...
public function validationRules(): array
{
return ['author_id' => '
use App\Models\Post;
use App\Http\Refiners\PostRefiner;
Post::refineBy(PostRefiner::class)->paginate();
use App\Http\Requests\PostRequest;
use App\Http\Refiners\PostRefiner;
use Illuminate\Support\Facades\DB;
public function rawPosts(PostRequest $request)
{
return DB::table('posts')
->whereNull('deleted_at')
->refineBy(PostRefiner::class)
->limit(10)
->get();
}
public function all(Request $request)
{
$validated = $request->validate([
// ...
])
return Post::query()->refineBy(PostFilter::class, ['author_id', 'order_by'])->paginate();
}
namespace App\Http\Refiners;
use Laragear\Refine\ModelRefiner;
class ArticleRefiner extends ModelRefiner
{
/**
* Return the columns that should only be uld exist for the query.
*
* @return string[]
*/
protected function getHasRelations(): array
{
return [];
}
/**
* Return the relations that should be missing for the query.
*
* @return string[]
*/
protected function getHasNotRelations(): array
{
return [];
}
/**
* Return the relations that can be queried.
*
* @return string[]
*/
protected function getWithRelations(): array
{
return [];
}
/**
* Return the relations that can be counted.
*
* @return string[]
*/
protected function getCountRelations(): array
{
return [];
}
/**
* Return the relations and the columns that should be sum.
*
* @return string[]
*/
protected function getWithSumRelations(): array
{
// Separate the relation name using hyphen (`-`). For example, `published_posts-votes`.
return [];
}
/**
* Return the columns that can be used to sort the query.
*
* @return string[]
*/
protected function getOrderByColumns(): array
{
return [];
}
}
namespace App\Http\Refiners;
use Illuminate\Support\Arr;
use Laragear\Refine\ModelRefiner;
class ArticleRefiner extends ModelRefiner
{
public function validationRules(): array
{
return Arr::only(parent::validationRules(), ['with', 'with.*', 'order_by']);
}
public function getKeys(Request $request): array
{
return Arr::only(parent::getKeys(), ['with', 'order_by']);
}
public function query(Builder $query, string $search): void
{
$query->where('name', 'like', $this->normaliseQuery($search));
}
// ...
}
namespace App\Http\Refiners;
use Illuminate\Support\Arr;
use Laragear\Refine\ModelRefiner;
class ArticleRefiner extends ModelRefiner
{
protected bool $fullTextSearch = true;
// ...
}