我正在从事数据分析项目。我正在使用Laravel 5.6和yajra / datatable(https://github.com/yajra/laravel-datatables)库进行开发。我面临的问题如下:
首先,我从查询生成器创建了数据表:
$querybuilder = $mydb->getQuery($expression);
return Datatables::of($querybuilder)->make();
但是,Datatable库的orderBy()和take()函数与$ querybuilder中的orderBy()和take()函数冲突。
例如,我的$querybuilder
是根据$query->table(..)->where(..)->orderBy(second_column)->take(5)
创建的
由于未事先调用get()
的{{1}}函数,因此在将其放入$querybuilder
后,查询由Datatable lib控制,以便orderBy()和take()被覆盖。
根据结果,我猜它被如下覆盖:
Datatables::of($querybuilder)->make()
此外,搜索功能也会发生这种情况。搜索功能将在表的所有记录上进行搜索,但不会在前5条记录上进行搜索。
我的解决方案在这种情况下是将 Query Builder 更改为 Collection
因此,我使用$querybuilder->orderBy(first_column)->take(10);
代替了Datatables::of($querybuilder->get())->make()
在这种情况下效果很好
很遗憾,在这种情况下,我想从数据库中获取所有数据。由于数据太大,PHP将内存不足,在将其传递给Datatable之前,我将所有这些作为 Collection 获得。如果我给数据表提供 Query Builder ,它可以通过paginate()函数处理数据量。
因此,有什么办法可以解决这两个问题?
我真的更喜欢将查询生成器提供给Datatable而不是Collection,因为这样可以帮助我在获取大数据时节省资源,而不是更改PHP配置中的内存限制。但是,我不知道在将其提供给Datatable后限制源查询的数据范围的解决方案。如果您知道解决方法,请帮助我。
先谢谢您