Laravel.io
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);
                });
            });      
        }
   }
}

Please note that all pasted data is publicly available.