如何修改数据表以便通过 ajax 从控制器获取部分数据库结果


How to modify a DataTable in order to get parts of DB results from a controller via ajax?

我有一个返回大量数据的控制器。我将这些数据传递给 Twig 模板,从中<table>,然后在此表元素上调用 .dataTable()。

这效率不高,因为它一次下载所有数据并将其传递给页面源代码......

我想修改它的方式将使 DataTable 能够使用 ajax 下载和显示前 500 条记录,然后当用户单击"更多"按钮时,它将下载并显示接下来的 500 条记录,依此类推。有没有办法使用数据表来实现这一点?

这是检索记录的方法(稍后在控制器中调用,结果直接传递给 Twig):

    public function getLoginsHistory(){
    $document_manager = $this
        ->container
        ->get('doctrine_mongodb')
        ->getManager();
    $query_builder = $document_manager
        ->createQueryBuilder('AppBundle:LoginEvent')
        ->sort('timestamp', 'desc')
        ->find();
    $query = $query_builder->getQuery();
    $entries = $query->execute();
    return $entries;
}

这就是在Twig中发生的事情:

        <div class="table-scrollable">
            <table id="login_history_table" class="table table-striped table-hover">
                <thead>
                <tr>
                    <th>User ID</th>
                    <th>Action</th>
                    <th>Time</th>
                </tr>
                </thead>
                {% for entry in entries %}
                    <tr>
                        <td>
                            {{  entry.userID}}
                        </td>
                        <td>
                            {{ entry.event==1 ? '<span class="label label-sm label-success"> Logged in </span>' : '<span class="label label-sm label-danger"> Logged out </span>' }}
                        </td>
                        <td>
                            {{  entry.timestamp|date }}
                        </td>
                    </tr>
                {% endfor %}
            </table>
        </div>
    </div>

然后在我的js文件中,我只是调用

$("#login_history_table").dataTable();

那么有没有办法实现我所描述的呢?

创建一个

新操作,该操作将响应 ajax 调用(必须提供两个参数 - currentOffset 和 maxRecords(如果您需要更多/小于 500)),并使用来自请求的参数调用登录历史记录查询,查询方法如下所示:

public function getLoginsHistory($offset = 0, $maxRecords = 500){
    $document_manager = $this
        ->container
        ->get('doctrine_mongodb')
        ->getManager();
    $query_builder = $document_manager
        ->createQueryBuilder('AppBundle:LoginEvent')
        ->sort('timestamp', 'desc')
        ->limit($maxRecords)
        ->skip($offset)
        ->find();
    $query = $query_builder->getQuery();
    $entries = $query->execute();
    return $entries;
}

请参阅有关结果限制的文档;