1

我正在从事数据分析项目。我正在使用 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() 被覆盖。$querybuilderDatatables::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 之后,我不知道限制数据范围的解决方案。如果您知道解决方案,请帮助我。

先感谢您,

4

0 回答 0