【问题标题】:Laravel cannot display mysql records over 10,000Laravel 无法显示超过 10,000 条的 mysql 记录
【发布时间】:2019-05-12 05:34:24
【问题描述】:

我无法在 Laravel 中显示超过 10,000 行的 mysql 行。

我已经阅读了有关使用块的信息,但我无法使其正常工作,我认为我可以使用数据表 javascript 来完成,这是我想要的每页最多显示 10 条记录,但是它会尝试加载首先完整的 10,000 条记录,然后将它们放在 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>

【问题讨论】:

标签: php mysql laravel


【解决方案1】:

不要。

表中的 10k 行本身可能会使浏览器崩溃。

尤其是在表格中。回流本身需要很长时间!

您的服务器可能内存不足。

如果您每秒收到多个请求,则每个下一个请求将花费越来越长的时间。

分页 https://laravel.com/docs/5.4/pagination

显示 10 行,而不是显示 10k 行,然后在 pagination 上重新加载页面,或者使用 datatables(例如)来获得 ajax-pagination。

【讨论】:

  • 这是我一直在尝试做的,我使用数据表 javascript 每页加载 10 个,但它首先尝试从数据库中提取所有内容。也是的,它确实会使浏览器崩溃
  • 你能把你的代码显示在你想去的地方吗
  • @bax 您需要彻底检查documentation 并在您的代码中测试AJAX 选项。如前所述,您目前没有使用 AJAX。
【解决方案2】:

你可以像这样使用 chunking

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

更多信息在:Chunking Results in Laravel

【讨论】:

    【解决方案3】:

    对于这么多记录,您应该分页并限制记录。

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

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

    在刀片中只需手动创建分页

    {{ $users->links() }}
    

    More details for pagination

    在此处删除 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);
    

    希望这会有所帮助。

    【讨论】:

    • 试过这个但得到错误:方法 Illuminate\Database\Eloquent\Collection::paginate 不存在。
    • 我认为你正在使用 ->get() 这使它成为一个集合,它不适用于集合。所以请使用不带 get() 的分页。 @bax
    • 好的,谢谢,现在不显示错误,正在加载 50,但不显示如何加载其余数据?
    • 您正在查看刀片中的数据吗?它正在加载所有内容,仅显示前 50 个。转到您的查看页面并使用此 {{ $users->links() }} 然后您可以检查其余记录。
    • 如果我使用这个代码 ->orderBy('login_time', 'desc')->paginate(50);我只看到 8 条记录。
    【解决方案4】:

    我认为laratables 如果您尝试将数据表与服务器端处理一起使用,这很有用

    安装

    composer require freshbitsweb/laratables
    

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

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

    更多详情laratables

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多