在foreach中从数据库获取数据的有效方法

时间:2019-04-13 22:16:32

标签: laravel optimization laravel-5.1 query-builder

我正在从Excel加载数据。在foreach中,我正在检查每个记录是否确实存在于数据库中:

$recordExists = $this->checkIfExists($record);

function checkIfExists($record) {
    $foundRecord = $this->repository->newQuery()
        ->where(..., $record[...])
        ->where(..., $record[...])
        ...
        ->get();
}

当excel最多包含1000个值(相对较小的数据)时,代码将运行2分钟左右。我想这是一种非常低效的方法。

我当时正在考虑将已加载的数据数组传递给方法checkIfExists,但是后来我无法查询该数据。

将如何进行?

2 个答案:

答案 0 :(得分:0)

如果您想在很短的时间内做很多工作,可以使用laravel队列。您的代码将在后端运行。客户无法识别该过程。只是向客户显示此进程正在排队的消息。就是这样

您可以从以下网址查看官方文档 https://laravel.com/docs/5.8/queues

答案 1 :(得分:0)

如果您将所有数据从数据库传递到函数(这样就不再对数据库进行查询),则可以使用laravel集合函数进行过滤。

其中一个是where => https://laravel.com/docs/5.8/collections#method-where

function checkIfExists($record, Collection $fetchedDataFromDatabase) {

    // laravel collectons 'where' function
    $foundRecord = $fetchedDataFromDatabase
        ->where(..., $record[...])
        ->where(..., $record[...]);
}

其他有用的功能。

  • 过滤器
  • 包含