laravel不能显示超过10000条mysql记录

8oomwypt  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(335)

我无法在laravel中显示超过10000行的mysql行。
我读过关于使用chunk的文章,但是我无法让它工作,我想我可以使用datatable javascript来完成,这是每页最多显示10条记录,这是我想要的,但是它尝试先加载整个10000条记录,然后再将它们放在一组10条记录中。我已经把代码放在下面了。
提前谢谢
我的页面控制器如下所示:

public function index($bzname)
{
    $user = Auth::guard('business')->user();
    $business_admin= BusinessAdmin::where('user_id', $user->id)->first();
    $business = Business::where('business_name', $bzname)->first();

    $users = User::join('business_users', 'users.id', '=', 'business_users.user_id')
        ->leftJoin('user_login_times', 'users.id', '=', 'user_login_times.user_id')
        ->leftJoin('social_logins', 'users.id', '=', 'social_logins.user_id')
        ->where('business_users.business_id', $business_admin->business_id)
        ->select('users.*', 'social_logins.provider', 'social_logins.social_id', 'user_login_times.login_time')
        ->orderBy('login_time', 'desc')->get();

    $users = $users->unique('id');

    // Get User Roles
    $roles = Role::all();

    $current_year = date('Y');

    $data = [
        'user' => $user,
        'users' => $users,
        'roles' => $roles,
        'bzname' => $bzname,
        'current_year' => $current_year,
        'bzadmin' => $business->owner_name,
    ];

    return View('pages.business_admin.users.show-users', $data);
}

我的用户页面显示为:

<tbody id="users_table">
    @foreach($users as $user)
     <tr>
      <td>{{$loop->index + 1}}</td>
       <td><img src="@if($user->image_url) {{ $user->image_url }} @else /images/faces/empty.png @endif" class="mr-2" alt="image"></td>
        <td class="hidden-xs">{{$user->first_name}}</td>
        <td class="hidden-xs">{{$user->last_name}}</td>
        <td class="hidden-xs" width="100px"><a href="mailto:{{ $user->email }}"          title="email {{ $user->email }}">{{ $user->email }}</a>
         </td>
         <td style="text-transform: capitalize;">{{ $user->gender }}</td>
          <td>{{ $current_year - $user->year }}</td>
          <td style="text-transform: capitalize;">{{ $user->country }}</td>
          <td>
          @if($user->provider == null)
          Email
          @else
         {{ $user->provider }}
         @endif
         </td>
         <td>{{ $user->login_time }}</td>

         <td class="actions" width="180px">
         <a class="btn btn-sm btn-success" href="{{ URL::to('/business/'.$bzname.'/admin/users/' . $user->id) }}"
                                           data-toggle="tooltip" title="View">
                                          {!! trans(('usersmanagement.buttons.show'))!!}
                                        </a>

                                    </td>
                                </tr>
                            @endforeach
                            </tbody>

<script type="text/javascript">
    $(function() {
        $('#user-listing').dataTable({
            dom: 'Bfrtip',
            buttons: [
                'copyHtml5', 'excelHtml5', 'pdfHtml5', 'csvHtml5'
            ],
            "iDisplayLength": 10,
        });
        $('#user-listing_filter').attr('style', 'display: none');
    });
</script>
yqlxgs2m

yqlxgs2m1#

我认为如果您试图使用datatable进行服务器端处理,那么laratables是很有用的

安装

composer require freshbitsweb/laratables

创建一个仅用于获取数据的路由

public function mydata()
{
  return Freshbitsweb\Laratables\Laratables::recordsOf(YOUR_Model);
}

有关laratables的更多详细信息:

pokxtpni

pokxtpni2#

这里有那么多的记录,你应该分页和限制记录。

$users = $users->paginate(50);

或者

$users = $users->simplePaginate(50);

在blade中,只需手动创建分页

{{ $users->links() }}

分页的详细信息
删除get():

$users = User::join('business_users', 'users.id', '=', 'business_users.user_id')
->leftJoin('user_login_times', 'users.id', '=', 'user_login_times.user_id')
->leftJoin('social_logins', 'users.id', '=', 'social_logins.user_id')
->where('business_users.business_id', $business_admin->business_id)
->select('users.*', 'social_logins.provider', 'social_logins.social_id', 'user_login_times.login_time')
->orderBy('login_time', 'desc')->paginate(50);

希望这有帮助。

4c8rllxm

4c8rllxm3#

你可以这样使用分块:

DB::table('users')->orderBy('id')->chunk(10000, function ($users) {
    foreach ($users as $user) {
        //
    }
});

更多信息请参见:laravel中的分块结果

bgtovc5b

bgtovc5b4#

不要。
表中的10k行本身会使浏览器崩溃。
尤其是在table上。回流本身将需要永远!
您的服务器可能内存不足。
如果每秒收到几个请求,那么下一个请求将花费越来越长的时间。
帕吉natehttps://laravel.com/docs/5.4/pagination
不是显示10k行,而是显示10,或者在分页时重新加载页面,或者使用datatables(例如)获得ajax分页。

相关问题