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