Lumen数据查询中使用chunk
2021-09-18 本文已影响0人
腿长袖子短
在数据查询中,当一次查询的结果返回的查询结果数据量很大时,一次读取到内存中会造成程序挂掉,但是需求又不能进行数据分页,比如在定时任务中,此时chunk
闪亮登场
这是一个定时任务中的使用示例
/**
* 命令描述
*
* @var string
*/
protected $description = '为已核销未结算未退款的订单券码生成唯一标识key';
/**
* @var BatchUpdateData
*/
protected $batch;
/**
* @var string
*
* 加密类型
*/
const ALGO = 'MD5';
/**
* @var integer
*
* 执行chunk时,数据块的数据容量
*/
const CHUNK_NUMBER = 2000;
public function __construct(BatchUpdateData $batch)
{
parent::__construct();
$this->batch = $batch;
}
public function handle()
{
set_time_limit(0);
$updateTableName = 'yz_virtual_log';
VirtualCodeLog::query()
->select(['id', 'order_id', 'virtual_code'])
->where([
['error_status', '=', 1],//已核销
['balance_status', '=', 0],//未结算
['refund_status', '=', null]//无退款
])
->chunk(self::CHUNK_NUMBER, function ($ret) use ($updateTableName) {
$dataArr = [];
foreach ($ret as $v) {
$only_key = hash_hmac(self::ALGO, $v->order_id . $v->virtual_code, bin2hex(random_bytes(8)));
$dataArr[] = [
'id' => $v['id'],
'only_key' => $only_key
];
}
$this->batch::batchUpdate($dataArr, $updateTableName);
});
$dingDD = new DingMsgController();
$dingDD->sendMsg('可兰素数据批量生成唯一key','执行成功');
}