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 无法添加外键约束