class Filter { protected $query; protected $params; public function __construct(Entity $model) { $this->query = $model->query(); } public function apply($params) { $this->params = array_filter($params); foreach($this->params as $key => $param) { $this->applyParam($key, $param); } } public function applyParam($key, $param) { if(method_exists($this, $key.'Filter')) { call_user_func_array([$this, $key.'Filter'], [$param]); } } public function streetFilter($value) { if(is_array($value)) { $this->query = $this->query->whereHas('objectdata', function ($query) use ($value) { $query->where(function ($query) use ($value) { $query->where('name', 'street_1')->whereIn('value', $value); })->orWhere(function ($query) use ($value) { $query->where('name', 'street_2')->whereIn('value', $value); }); }); } } }