Laravel.io
<?php

class QueriesController extends BaseController {

    public function init()
    {

        $page = Input::exists('page') ? Input::get('page') : 1;
        $perpage = Input::exists('per_page') ? (Input::get('per_page') > 50) ? 50 : Input::get('per_page') : 18;
        $sort = Input::exists('sort') ? Input::get('sort') : 'created_at';
        $sdir = Input::exists('sdir') ? Input::get('sdir') : 'desc';
        $tags = Input::exists('tags') ? (explode(',', Input::get('tags'))) : null;
        $providers = Input::exists('providers') ? (explode(',', Input::get('providers'))) : null;

        $link = new Link;

        if($tags && !$providers)
        {
            $links = $link->whereHas('tags', function($q) use ($tags) {
                $q->whereIn('text', $tags);
            });
        }

        if($providers && !$tags)
        {
            $links = $link::whereIn('provider_name', $providers);
        }

        if($tags && $providers)
        {
            $links = $link->whereIn('provider_name', $providers)->whereHas('tags', function($q) use ($tags) {
                $q->whereIn('text', $tags);
            });
        }

//        this, surprisingly, works
//        $count = $links->count();
//        $load = $links->get()->load('tags');
//        $array = $load->toArray();
//        return Paginator::make($array, $count, $perpage);
        
//        now, how to make it automagically work for the built in paging?
        
        return $links->load('tags')->orderBy($sort, $sdir)->simplePaginate($perpage);

    }

}

Please note that all pasted data is publicly available.