I have this simple eloquent query, works fine, but with few records.
When database increments until 100000 records become very slow.

我读的应该是使用chunk而不是get.我如何为这个查询实现它?

$collection = Contact::with('shop');
$collection = $collection->orderBy('created_at', 'DESC');
$collection = $collection->get();
$json = $collection->map(function ($contact) {
    return [ 
        'id' => $contact->id,
        'name' => $contact->name,   
        ...about 50 columns more.
        'shop' => [
                'id' => optional($contact->shop)->id,
                'name' => optional($contact->shop)>name
        ],  
        ...about 6 relations more.
    ];
});
$json = $json->paginate(50);
return response()->json(['contacts' => $json], 200);

推荐答案

你正在转换获取所有数据,比如1M或它有多少条记录.然后映射它并对其进行分页,只得到50.你的代码存在巨大的性能问题.

你可以这样直接打电话:

return response()->json(['contacts' => Contact::with('shop')->orderBy('created_at', 'DESC')->paginate(50)], 200);

如果您只需要联系人的id和姓名:

return response()->json(['contacts' => Contact::select('id', 'name', 'created_at')->orderBy('created_at', 'DESC')->paginate(50)], 200);

Laravel相关问答推荐

如何使中继器项目计数动态Laravel Filament V3?

如何在 Laravel 中获取特定月份的最后一个日期?

Laravel Eloquent查询与集合优化

将错误消息抛出并显示为关联数组

未找到 apiResource 404 中的变量

未捕获的 TypeError:Vue.component 不是函数

Laravel belongsToMany 关系在两个表上定义本地键

刚安装 Lumen 并得到 NotFoundHttpException

Eloquent 的集合方法,例如 only 或 except 返回一个空集合

转储或 dd laravel 在结果前添加字符时出错

Laravel 5.5 类型错误:传递给 Illuminate\Auth\EloquentUserProvider::validateCredentials() 的参数 1 必须是实例

Laravel 5.1 重命名项目

使用数据库中的值进行动态邮件配置 [Laravel]

Laravel - DecryptException:'MAC 无效'

我在哪里放置可以显示 Flash 消息的 Laravel 4 辅助函数?

Laravel 不活动时间设置

登录后 DevTools 无法解析 SourceMap 错误将重定向到该 js 文件

如何在 Laravel 测试中禁用选定的中间件

如何以 JSON 格式发送 Laravel 错误响应

Laravel:Redis 无法建立连接:[tcp://127.0.0.1:6379]