在我的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);
因为$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常成员函数是互为重载的,那么如果我们直接像下面这样调用该方法,会调用的是哪个呢? 那么运行下程序