Laravel查询构建器结合DataTables/Yajra懒加载分页异常求助
解决Yajra DataTables加载全量数据而非分页的问题
你当前代码用->get()会直接查询并返回所有10万+条记录,这完全违背了DataTables服务器端分页的设计逻辑。正确的做法是让Yajra DataTables接管查询,自动处理分页、排序、搜索等服务器端操作,具体修改如下:
控制器代码修改
use Yajra\DataTables\Facades\DataTables; public function loadGoogleProspects() { // 只构建查询构造器,不要调用get() $query = DB::table('GoogleProspects') ->orderBy('id') ->whereNull('deleted_at') ->select([ 'GoogleProspects.id as id', 'searchRequest as searchRequest', 'websiteEmail as websiteEmail', 'websiteHomePageURL as websiteHomePageURL', 'websitePhoneNr as websitePhoneNr', 'active as activeFlag' ]); // 交给Yajra处理分页逻辑,返回标准DataTables格式的JSON return DataTables::of($query)->make(true); }
前端配置要求
确保前端DataTables开启服务器端模式,这样才会向服务器发送分页参数(如start、length),Yajra才能据此返回对应页数的数据:
$('#google-prospects-table').DataTable({ processing: true, serverSide: true, // 必须开启这个配置 ajax: '/your/route/to/loadGoogleProspects', // 对应上面控制器的路由 columns: [ { data: 'id' }, { data: 'searchRequest' }, { data: 'websiteEmail' }, { data: 'websiteHomePageURL' }, { data: 'websitePhoneNr' }, { data: 'activeFlag' } ] });
关键原理说明
- 去掉
->get()后,查询不会立即执行,Yajra会根据前端传递的分页参数,自动给查询添加LIMIT和OFFSET条件,只查询当前页需要的少量数据。 make(true)会返回包含总记录数、过滤后记录数、当前页数据的标准JSON结构,前端DataTables能直接识别并渲染分页。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

