Skip to content

Instantly share code, notes, and snippets.

@shibbirweb
Last active November 9, 2020 16:56
Show Gist options
  • Select an option

  • Save shibbirweb/99dfa5c751b1d2bae2389e8a75fb515f to your computer and use it in GitHub Desktop.

Select an option

Save shibbirweb/99dfa5c751b1d2bae2389e8a75fb515f to your computer and use it in GitHub Desktop.
Laravel Pipeline Stracture
<?php
namespace App\QueryFilters;
use Closure;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str;
abstract class BaseFilter implements QueryFilterContract
{
/**
* @var string $request_key_name filter name
*/
protected $request_key_name;
/**
* @var string $request_key_value filter value
*/
private $request_key_value;
public function __construct()
{
if (!$this->request_key_name) {
$this->setRequestKeyName();
}
$this->setFilterValue();
}
/**
* Database query filter
*
* @param Builder $builder Database eloquent model instance
* @param Closure $next
* @return mixed
*/
public function handle(Builder $builder, Closure $next): Builder
{
if (!request()->has($this->request_key_name) OR $this->skipFilterIf()) {
return $next($builder);
}
return $next($this->applyFilters($builder, $this->request_key_value));
}
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected abstract function applyFilters(Builder $builder, $value): Builder;
/**
* Skip filtering value condition
*
* @return bool
*/
protected function skipFilterIf(){
return $this->request_key_value === null;
}
/**
* Set Filter name
*
* @return void
*/
private function setRequestKeyName(): void
{
$class_base_name = class_basename($this);
$this->request_key_name = (string)Str::of($class_base_name)
->snake()
->beforeLast('_query');
}
/**
* Set Filter value
*
* @return void
*/
private function setFilterValue(): void
{
$this->request_key_value = request($this->request_key_name);
}
}
<?php
namespace App\Http\Controllers;
class LessonController extends Controller
{
/**
* Search result
*
* @param Request $request
* @return Application|Factory|View|Response
*/
public function search(Request $request)
{
$lessons = app(Pipeline::class)
->send(Lesson::with('topic.subject'))
->through([
TopicIdQuery::class,
NameQuery::class,
Lesson_SubjectIdQuery::class
])
->thenReturn()
->paginate(25);
return view('actions.lesson.index', compact('lessons'))
->with($this->meta);
}
}
<?php
namespace App\QueryFilters\Globals;
use App\QueryFilters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
class NameExactQuery extends BaseFilter
{
protected $request_key_name = 'name';
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected function applyFilters(Builder $builder, $value): Builder
{
return $builder->where('name', $value);
}
}
<?php
namespace App\QueryFilters\Globals;
use App\QueryFilters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
class NameQuery extends BaseFilter
{
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected function applyFilters(Builder $builder, $value): Builder
{
return $builder->where('name', "like", "%". $value ."%");
}
}
<?php
namespace App\QueryFilters\Globals;
use App\QueryFilters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
class TopicIdQuery extends BaseFilter
{
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected function applyFilters(Builder $builder, $value): Builder
{
return $builder->where('topic_id', $value);
}
}
<?php
namespace App\QueryFilters\Globals;
use App\QueryFilters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
class NameExactQuery extends BaseFilter
{
protected $request_key_name = 'name';
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected function applyFilters(Builder $builder, $value): Builder
{
return $builder->where('name', $value);
}
}
<?php
namespace App\QueryFilters\Globals;
use App\QueryFilters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
class NameQuery extends BaseFilter
{
/**
* Apply the filter
*
* @param Builder $builder Eloquent Query builder
* @param mixed $value Request key value
* @return Builder Eloquent Builder instance
*/
protected function applyFilters(Builder $builder, $value): Builder
{
return $builder->where('name', "like", "%". $value ."%");
}
}
<?php
namespace App\QueryFilters;
use Closure;
use Illuminate\Database\Eloquent\Builder;
interface QueryFilterContract
{
/**
* Database query filter
*
* @param Builder $builder Database eloquent model instance
* @param Closure $next
* @return mixed
*/
public function handle(Builder $builder, Closure $next): Builder;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment