Laravel 中使用原始 SQL 查询进行延迟加载

问题描述 投票:0回答:1

我有一个大表(100K +)记录,我正在使用数据表和 Yarja。

我的查询开始于

$gp = 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'
            ])
            ->get();

但它似乎正在加载所有记录而不是分页号。

请问有什么想法吗?

sql laravel datatables-1.10
1个回答
0
投票

这里的问题似乎是您的查询似乎正在从数据库加载所有 100K+ 记录,忽略您可能打算使用

DataTables
和 Yajra 实现的分页机制。

可能的原因

  • 缺乏与 DataTables 的集成:如果查询未设置为与 DataTables 和 Yajra 无缝协作,它将检索 所有记录。
  • 无分页:查询中的
    get()
    方法会获取所有记录。 缺少分页逻辑。
  • DataTables 配置: 客户端
    DataTables
    库可能 未正确设置以请求分页数据。

解决方案

要正确集成

DataTables
和 Yajra 进行分页,您应该利用 Yajra 的内置功能来处理服务器端操作。这是
php
中的一个通用示例:

use DataTables;
//...
public function getData()
{
    $query = DB::table('GoogleProspects')
                ->orderBy('id')
                ->whereNull('deleted_at')
                ->select([
                    'GoogleProspects.id as id',
                    'searchRequest',
                    'websiteEmail',
                    'websiteHomePageURL',
                    'websitePhoneNr',
                    'active as activeFlag'
                ]);

    return DataTables::of($query)->make(true);
}

在你的JavaScript中:

$(document).ready(function() {
    $('#your-table-id').DataTable({
        "processing": true,
        "serverSide": true,
        "ajax": "your-server-side-url"
    });
});

确保将

your-server-side-url
替换为将调用
getData()
方法的 URL。

这样做,服务器只会发回

DataTable
中每个“页面”所需的数据,而不是所有 100K+ 记录。这应该会大大加快加载时间。

确保您已在客户端正确设置 DataTables 库来处理服务器端处理,并将其配置为指向适当的服务器端 URL。

© www.soinside.com 2019 - 2024. All rights reserved.