【问题标题】:Laravel (3) Pagination Sorting & FilteringLaravel(三)分页排序和过滤
【发布时间】:2013-02-19 08:19:39
【问题描述】:

我的“服务器”表中的所有“服务器”列表在我的视图中以分页方式返回。我一直在努力弄清楚如何进行排序(如果可能,使用 asc 和 desc)和过滤(在结果中搜索)。

这是我的控制器代码:

 $servers = Server::paginate(5);
 return View::make('servers.list')
            ->with('game', '')
            ->with('servers', $servers);

这是我的排序视图代码:

<ul class="nav">
     <li class="active"><a href="#"><i class="icon-angle-down"></i>{{ Lang::line('servers.rank')->get() }}</a></li>
     <li><a href="#">{{ Lang::line('servers.date')->get() }}</a></li>
     <li><a href="#">{{ Lang::line('servers.language')->get() }}</a></li>
     <li><a href="#">{{ Lang::line('servers.uptime')->get() }}</a></li>
     <li>{{ HTML::link(URL::full() .'?sort=votes', Lang::line('servers.votes')->get()) }}     </li>
</ul>

我希望通过简单的锚链接完成排序,点击投票或排名或日期将返回具有该排序的数据。单击当前选中的同一个排序锚点将反转排序方向。

我还有一堆“过滤器”选项,例如类别和整数范围,当应用这些选项时,它们会“过滤”/搜索表格并返回与过滤器之前选择的排序相同的结果。

分页类是否可以实现所有/所有这些?如果不是,我可能会怎么做?不确定使用 laravel 时的最佳方式。

【问题讨论】:

    标签: php sorting filtering laravel laravel-3


    【解决方案1】:

    得益于强大的分页和输入类,这在 laravel 中很容易做到。在你的视图中试试这个:

    示例视图

    清理视图

    <form action="" method="get" id="filter">
    
        Show <select name="game_id">
                <option value="">All</option>
            <?php foreach ($games as $game):?>
                <option value="<?=$game->id?>" <?=($game->id == Input::get('game_id')) ? 'selected="selected"' : null?>><?=$game->name?></option>
            <?php endforeach;?>
        </select>
    
        Show <select name="server_id">
                <option value="">All</option>
            <?php foreach ($servers as $server):?>
                <option value="<?=$server->id?>" <?=($server->id == Input::get('server_id')) ? 'selected="selected"' : null?>><?=$server->name?></option>
            <?php endforeach;?>
        </select>
    
        <input type="submit" value="Filter" rel="filter">
    
    </form>
    
    <hr>
    
    <?php if (count($servers) > 0):?>
    
        <?=$pagination?>
    
        <table>
            <tr>
                <th><a href="<?=URL::to('servers?sort=id'.$querystr)?>">ID</a></th>
                <th><a href="<?=URL::to('servers?sort=rank'.$querystr)?>">RANK</a></th>
                <th><a href="<?=URL::to('servers?sort=date'.$querystr)?>">DATE</a></th>
                <th><a href="<?=URL::to('servers?sort=language'.$querystr)?>">LANGUAGE</a></th>
                <th><a href="<?=URL::to('servers?sort=uptime'.$querystr)?>">UP TIME</a></th>
                <th><a href="<?=URL::to('servers?sort=votes'.$querystr)?>">VOTES</a></th>
            </tr>
            <tr>
                <td>
                    ...
                </td>
            </tr>
        </table>
    
        <?=$pagination?>
    
    <?php else:?>
        <h2>No results found.</h2>
    <?php endif;?>
    

    示例控制器

    public function get_action()
    {
        // CACHE SORTING INPUTS
        $allowed = array('rank', 'date', 'language', 'uptime', 'votes'); // add allowable columns to search on
        $sort = in_array(Input::get('sort'), $allowed) ? Input::get('sort') : 'id'; // if user type in the url a column that doesnt exist app will default to id
        $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; // default desc
    
        $servers = Server::order_by($sort, $order);
    
        // FILTERS
        $game = null;
        $server = null;
    
        if (Input::has('game_id')) {
            $servers = $servers->where('game_id', Input::get('game_id'));
            $game = '&game_id='.Input::get('game_id');
        }
        if (Input::has('server_id')) {
            $servers = $servers->where('server_id', Input::get('server_id'));
            $server = '&server_id='.Input::get('server_id');
        }
    
        // PAGINATION
        $servers = $servers->paginate(5);
    
        $pagination = $servers->appends(
            array(
                'game_id'       => Input::get('game_id'),
                'server_id' => Input::get('server_id'),
                'sort'      => Input::get('sort'),
                'order'     => Input::get('order')
            ))->links();
    
        return View::make(servers.list)->with(
            array(
                'game'          => null,
                'servers'       => $servers,
                'pagination'    => $pagination,
                'querystr'      => '&order='.(Input::get('order') == 'asc' || null ? 'desc' : 'asc').$game.$server
            ));
    }
    

    【讨论】:

    • 感谢您花时间写下所有这些,这非常有帮助和感激!只是想知道,如果您允许多个过滤器(例如多个选择)但用户可以选择使用哪个过滤器,您将如何在控制器中处理它?有没有比检查用户输入的每种类型更有效的方法?也许类似于所有输入项的数组?
    • 是的,我同意这很混乱。我清理了视野。据我所知,您必须检查用户输入,否则您将查询您不想要的结果。最终,您可以在模型中构建很多这样的内容,或者制作一个包装类,以便您可以在其他地方使用它。 Wrapper 类是我想做的东西,实际上可能有一个。
    • 而你称之为“简单”? :) 我发现在 CakePHP 中它更简单,只需一行 Paginator-&gt;sort('myField') 我希望它在 Laravel 中也这么简单!
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多