当前位置: 首页 > 知识库问答 >
问题:

对我的变量的成员函数groupBy()的Laravel块调用

岑元徽
2023-03-14

在我的Laravel8项目中,我调度了一个作业,该作业运行并从数据库中收集一堆数据,这些数据可以是从几百行数据到数千行数据的任意数量,因此可能会占用相当大的内存。

返回结果后,将对其进行处理并添加到数据库表中,我希望有某种进度指示(百分比),可以在分块进行时报告给用户,我有两个表,一个reports和一个reports_data表。

我已将by query切换到Laravel的chunk方法,并将数据集合拆分为更小的位,因为这样可以提高性能,但出于某种原因,为了将数据作为一个整体使用,就好像它是一个集合一样,我将其推入一个名为$res的空数组中,但我得到一个错误,因此我的作业FailsError:调用array上的成员函数groupBy():

错误:调用数组上的成员函数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();
          }

这一点似乎也不起作用,因为它没有返回任何集合,而这正是我的其余代码工作所需要的:

$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);

共有1个答案

皇甫夕
2023-03-14

因为$res=[];是一个数组,而不是Elecoquent的Illumate\support\collection的实例。因此,您不能调用$res->groupby(),因为您正在第一条if语句中尝试。

删除->chunk()方法,并通过使用slice来获取数据块,例如,在总是获取数据片的循环中。

也可以调用collection($res)将数组转换回集合。但是,如果已经有一个集合,那么在后面直接将它转换回数组是没有意义的。所以我会用切片的方法。

您还可以(通过块回调)执行以下操作:

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

后来呢:

foreach($res as $chunk) {
  $chunk->groupBy();
}
 类似资料:
  • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

  • 我想在数据库中存储用户配置数据,我正在关注这个论坛的帖子http://forumsarchive.laravel.io/viewtopic.php?id=10406但当我实现它时,laravel抛出了一个错误。我运行了composer dump autoload,但似乎没有任何功能。这里有什么问题? //文件名:app/config/settings。php 用法: echo Config::ge

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问

  • 问题内容: 因此,我正在重构代码以实现更多的OOP。我设置了一个类来保存页面属性。 稍后,我像这样调用set_page_title()函数 当我收到错误消息时: 调用非对象上的成员函数set_page_title() 那我想念什么呢? 问题答案: 这意味着它不是对象的实例。我们可以看到您用来初始化变量的代码吗? 当您期望特定的对象类型时,还可以使用PHP的类型提示功能 Docs 在违反逻辑时得到错

  • 主要内容:const成员变量,const成员函数(常成员函数)在类中,如果你不希望某些数据被修改,可以使用 关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《 C++初始化列表》回顾。 const成员函数(常成员函数) con

  • 本文向大家介绍浅析成员函数和常成员函数的调用,包括了浅析成员函数和常成员函数的调用的使用技巧和注意事项,需要的朋友参考一下 在Coordinate类中,有一个Display()成员函数和一个Display() const常成员函数,代码如下 Display()成员函数和一个Display() const常成员函数是互为重载的,那么如果我们直接像下面这样调用该方法,会调用的是哪个呢? 那么运行下程序