【问题标题】:How to fetch records by 10 on backend side and then load each records using Laravel DataTables?如何在后端获取 10 条记录,然后使用 Laravel DataTables 加载每条记录?
【发布时间】:2021-05-02 09:00:40
【问题描述】:

您好,我在为用户获取数据时使用 DataTables。但是用户有大量记录,加载需要时间。我想从database 中获取data,以便仅在数据库中获取10 records。所以场景是当你去users view时它只会在数据库中得到10 records,然后当你在数据库中单击下一步时加载另一个10 records

UserController.php

// Show Users
    public function index()
    {
        return view('user-list');
    }

// Get Users Using Datatables
    public function getData()
    {

        $users = User::all()->get();

        return Datatables::of($users)
        // EditColumn User ID
        ->editColumn('user_id', function ($user) {
            return '<span class="text-red">$user->user_id</span>';
        })
        ->addColumn('btn_login', function ($user) {
            return $user->is_active . '<a class="btn btn-default" type="button" href="#">Sample</a>';
        })
        ->rawColumns(['btn_login'])
        ->make(true);
    }

web.php

Route::get('userlist', 'UserController@index')->name('user.list');
// Get Users Via DataTables
Route::get('/api/userlist', 'UsersController@getData')->name('api.user.list');

user-list.blade.php

<div class="box">
    <div class="box-header"></div>
    <div class="box-body">
        <div class="table-responsive">
            <table id="users-table" class="table table-hover table-condensed table-striped">
                <thead>
                    <tr>
                        <th>User ID</th>
                        <th>User Name</th>
                        <th>Email</th>
                        <th>Phone Number</th>
                        <th>Login</th>
                    </tr>
                </thead>

            </table>
        </div>
    </div>
    </div>
    <div class="box-footer"></div>
</div>

<script>
$('#users-table').DataTable({
    processing: true,
    responsive: true,
    serverSide: true,
    stateSave: true,
    order: [ [0, "desc"] ],
    ajax: '{{ route("api.user.list") }}',
    columns: [
        {data: 'user_id'},
        {data: 'name'},
        {data: 'email'},
        {
            data: 'phone_number',
            defaultContent: "---"
        },
        {data: 'btn_login'}
    ]
});
</script>

问题出在这段代码中:

$users = User::all()->get();

因为当我尝试使用dd($users) 时,它会获取用户表中的所有数据。我想要实现的是每个只获取10 records,当您单击下一步时,它将在后端获取另一个10 records

有什么办法可以操纵这个吗?

不过,我是使用 Laravel 数据表的新手,非常感谢任何人的帮助。

【问题讨论】:

  • 查看pagination 文档。
  • @Unflux 是否可以在使用数据表时执行paginate()?我的 getData() 函数正在使用 ajax 来获取数据,不知何故我的控制台出错了。
  • 您遇到了什么错误?
  • 你能不能把$users = User::all()-&gt;get();改成$users = User::query();,这样你只把查询传递给dataTable,它会自己限制结果。

标签: php laravel eloquent datatables


【解决方案1】:

由于您的数据表是服务器端,您可以通过 iDisplayLength 选项指定记录长度。只需在您的选项中添加以下行,例如在处理后:true,

'iDisplayLength': 10,

现在要使其工作,而不是获取所有行并传递集合,您只需构造查询并将其传递给 Datatables。是的,它接受没有 get() 的查询,它会根据 iDisplayLength 和 Datatables 在客户端保存的位置指针自动决定要获取哪些行。另外最好提一下选择,这样你就不用选择 *.所以你做这样的事情:

$users = User::select(['user_id', 'name', 'email', 'phone_number', 'btn_login');

return Datatables::of($users)
            ...

Datatables 分页默认情况下是打开的,所以这应该可以工作。 此外,如果您想获取关系,您需要手动加入表并选择特定数据。这是必须的,因为通过 eloquent 模型加载关系会更糟地影响您的性能。假设您有一个联系人表,并且联系人存储在该表中,使用 user_id 使其属于用户,但用户可能碰巧没有联系人,因此它应该是左连接而不是内连接。这是使其工作的查询。不过,您需要先导入数据库。

use Illuminate\Support\Facades\DB;

$query = DB::table('users as u')
    ->leftJoin('contacts as c', 'u.user_id', '=', 'c.user_id')
    ->select(['u.user_id', 'u.name', 'c.email', 'c.phone_number', 'u.btn_login');

return Datatables::of($query)
            ...

现在,为了使表搜索和排序正常工作,您需要将正确的列名称及其表选择器作为名称传递给数据表,因此列选项将如下所示:

columns: [
    {data: 'user_id', name: 'u.user_id'},
    {data: 'name', name: 'u.name'},
    {data: 'email', name: 'e.email'},
    {
        data: 'phone_number',
        name: 'c.phone_number',
        defaultContent: "---"
    },
    {data: 'btn_login', name: 'u.btn_login'}
]

【讨论】:

  • 我目前正在使用 eloquent,因为如果将来我会向用户添加新的关系,例如 $users = User::all()-&gt;with(['store'])-&gt;get();
  • 我想在答案中提及关系,但由于您没有要求,我将其排除在外。我更新了答案以包含它。
  • 以下答案是否只适合雄辩?喜欢这个$users = User::all()-&gt;with(['store'])-&gt;get(); 而不是使用查询生成器?
  • With 用于急切加载。你应该在获取模型之前使用它,这样$users = User::with('store')-&gt;get();get() 没有传递任何参数,就像 all() 一样。如果您以这种方式使用它,您将获取用户表中的所有行两次。
  • 另外,如果答案可以接受,请接受并关闭问题
猜你喜欢
  • 2021-07-23
  • 2017-10-29
  • 2019-12-28
  • 2023-03-10
  • 1970-01-01
  • 2012-01-23
  • 2017-09-18
  • 2023-01-28
相关资源
最近更新 更多