Laravel for 循环中的 findOrFail 导致的数据库查询问题

Laravel DB Query issues caused by findOrFail in for loop

我的应用程序处理数以千计的数据库条目,并允许用户导出搜索结果列表的特定部分。

每个 Entry 都包含特定文件,用户希望以压缩文件(例如 zip)的形式下载它们。这工作正常,但我 运行 很可能进入 最大执行超时 。出于调试的原因,我尝试在我的 php 脚本中简单地调整 PHP 的 max_execution_time。两者都没有遗漏错误。

基本上我有两个问题:

  1. 如何正确分析问题? (是否与最大执行时间有关)
  2. 如何省略最大执行超时? (很可能是这样,因为查询量较小时它工作得很好)

示例代码:

public function export(Requests\ExportRequest $request)
{
    $input = $request->all();

    foreach ($input['entries'] as $id) {
        $entry = Entry::findOrFail($id);
    }
}

编辑:

Fyi,问题不在于 max_execution_time,即使它确实大量减少了 SQL 查询。问题是由 max_input_vars 的限制引起的。目标条目在表单中检查并发送到 export() 函数。每个复选框都有 name=entries[],这导致每个条目都有一个单独的输入值。您可以在此处阅读有关此问题的更多信息:Is there a limit on checked checkboxes in PHP form POST? (Consider also reading this specific answer)

您 运行 遇到了 N+1 问题:您对要接收的每个条目执行单独的查询。您可以通过编写查询来一次检索所有条目。我不完全知道在您发布代码之后会发生什么,因为发布的代码实际上并没有做任何事情。但是 运行ning 1000 个单独的查询比 运行ning 1 个大查询慢几个数量级。

public function export(Requests\ExportRequest $request)
{
    $input = $request->all();

    $allEntries = Entry::whereIn('entry_id', $input['entries'])->get();

    // All entries is a Collection with all the queried entries in it
}

我的经验法则是,每当 max_execution_time 发挥作用时,我就做出了错误的架构决定。也许我的解决方案解决了问题,也许@TheFallen 解决了问题。但是我们需要更多的代码来分析它。