簡體   English   中英

Laravel 塊調用我的變量上的成員 function groupBy()

[英]Laravel chunk Call to a member function groupBy() on my variable

在我的 Laravel 8 項目中,我正在調度一個作業,該作業運行並從數據庫中收集一堆數據,數據可能是從幾百行數據到可能數千行的任何數量,因此可能是相當密集的 memory。

返回結果后,它們會被處理並添加到數據庫表中,我希望有某種進度指示,可以在分塊進行時向用戶報告,我有兩個表,一個reports和一個reports_data表。

我已經通過查詢切換到 Laravel 的chunk方法,並將數據集合分成更小的部分,因為這應該可以提高性能,但出於某種原因,將我的數據作為一個整體來使用,就好像它是我正在推送的集合一樣它進入一個名為$res的空數組,但我收到一個錯誤,所以我的工作失敗錯誤:調用數組上的成員 function groupBy():

錯誤:調用數組上的成員 function groupBy()

我想知道我錯過了什么......

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{

  $filters = json_decode($this->report->discovery_filters);
  $data = [];

  // create
  foreach ($filters as $findable) {
    $resultData = [];

    // query data
    if (isset($findable->query)) {
      $this->setDynamicChartOptions();

      $res = [];
      $chunkData = DB::table($findable->query->table)
                     ->select($findable->query->columns)
                     ->where($findable->query->filterBy)
                     ->orderBy($findable->query->orderBy->field, $findable->query->orderBy->direction)
                     ->chunk(100, function ($chunkedResults) use ($res) {
                        foreach ($chunkedResults as $chunk) {

                          // how to update some kind of progress?
                          array_push($res, $chunk);
                          var_dump(count($res));
                        }
                      });

      // $res expected as a collection? Maybe I can use the `collect` method?
      if (isset($findable->query->useGrouping) && $findable->query->useGrouping) {
        $results = $res->groupBy(function ($item, $key) use ($findable) {
          $date = Carbon::parse($item->{$findable->query->groupBy});
          return $date->format($findable->query->groupByFormat);
        });

        $results = $results->map(function ($item, $key) {
          return $item[0];
        });

        $resultData = $results->flatten();
      }
    }

    $res = [
      'componentID' => $findable->componentID ?? 0,
      'type' => $findable->type ?? '',
      'name' => $findable->name ?? '',
      'labelsKey' => $findable->query->labelsKey ?? '',
      'dataKey' => $findable->query->dataKey ?? '',
      'data' => $resultData ?? [],
      'structure' => $this->getStructure($findable, $resultData)
    ];

    array_push($data, $res);
  }

  // create our report data entry
  $this->createReportData($data);
}

更新:

我試過分塊和分組,工作失敗:

$res = [];
$chunkData = DB::table($findable->query->table)
               ->select($findable->query->columns)
               ->where($findable->query->filterBy)
               ->orderBy($findable->query->orderBy->field, $findable->query->orderBy->direction)
               ->chunk(100, function ($chunkedResults) use ($res) {
                  $res[] = $chunkedResults;
                  foreach($res as $chunk) {
                    $chunk->groupBy();
                  }
                });

這也失敗了……

res = [];
          $chunkData = DB::table($findable->query->table)
                         ->select($findable->query->columns)
                         ->where($findable->query->filterBy)
                         ->orderBy($findable->query->orderBy->field, $findable->query->orderBy->direction)
                         ->chunk(100, function ($chunkedResults) use ($res) {
                            $res[] = $chunkedResults;
                          });

          foreach($res as $chunk) {
            $chunk->groupBy();
          }

而且這似乎仍然不起作用,因為它不會返回任何集合,這是我的代碼的 rest 工作所需要的:

$res = [];
$chunkData = DB::table($findable->query->table)
               ->select($findable->query->columns)
               ->where($findable->query->filterBy)
               ->orderBy($findable->query->orderBy->field, $findable->query->orderBy->direction)
               ->chunk(100, function ($chunkedResults) use ($res) {
                  foreach ($chunkedResults as $key => $chunk) {
                    array_push($res, $chunk);
                  }
                });

$res = collect($res);

因為$res = []; 是一個數組,而不是 eloquent 的Illuminate\Support\Collection的實例。 因此,您不能調用$res->groupBy() ,因為您正在第一個 if 語句中嘗試。

刪除->chunk()方法並通過使用slice來獲取數據塊,例如在始終獲取數據切片的循環中。

或者,調用collect($res)將數組轉回集合。 但是,當已經有一個 Collection 時,首先將其放入一個數組中只是在后面直接將其轉換回來是沒有意義的。 所以我會用切片方法 go 。


您還可以 - 使用您的塊回調 - 執行以下操作:

->chunk(100, function ($chunkedResults) use ($res) {
  $res[] = $chunkedResults;
});

接着:

foreach($res as $chunk) {
  $chunk->groupBy();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM