我有一个返回大量数据的控制器。我将这些数据传递给 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;
}
请参阅有关结果限制的文档;