Laravel 无法显示超过 10,000 条的 mysql 记录

Posted

技术标签:

【中文标题】Laravel 无法显示超过 10,000 条的 mysql 记录【英文标题】:Laravel cannot display mysql records over 10,000 【发布时间】: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" ></td>
        <td class="hidden-xs">$user->first_name</td>
        <td class="hidden-xs">$user->last_name</td>
        <td class="hidden-xs" ><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" >
         <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>

【问题讨论】:

玩转分页:***.com/questions/15229303/… 【参考方案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:

【讨论】:

以上是关于Laravel 无法显示超过 10,000 条的 mysql 记录的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/000webhost/邮递员。无法得到任何回应

在 Redshift 中获取超过 100,000 条记录 [关闭]

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 [Laravel 7.0]

SQLSTATE[HY000]:一般错误:1005 无法创建表 Laravel 8

Laravel - php artisan migrate - SQLSTATE[HY000] [14] 无法打开数据库文件

Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束