代码示例:
<?php
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Support\Facades\Schema;
use App\Models\ActionTrack;
public function getData(Request $request){
$post = $request->all();
$id = $post['id'];
$queries = collect();
$start_at = '2023-09-01';
$end_at = '2029-01-01';
$model = new ActionTrack();
$queries = collect();
$startDate = Carbon::parse($start_at)->startOfMonth();
$endDate = Carbon::parse($end_at)->endOfMonth();
$select = [
DB::raw("(CASE WHEN model='channel_qrcode' and action_id=2 and model_id=$id THEN uid ELSE null END) as a1")
];
//轮询
foreach (CarbonPeriod::create( $startDate, '1 month', $endDate) as $month) {
$t = $model->originTable ."_" .$month->format('Ym');
if (!Schema::hasTable($t)) {
continue;
}
$query = DB::table("$t")->select($select);
$queries->push($query);
}
//取出第一个作为查询对象,其他作为合并对象
$unionQuery = $queries->shift();
if(empty($unionQuery)) return null;
$queries->each(function ($item) use ($unionQuery) {
$unionQuery->unionAll($item);
});
// 设置临时表,执行查询
$resp = DB::table(DB::raw("({$unionQuery->toSql()}) as t"))->mergeBindings($unionQuery)->select(
DB::raw('count(distinct a1) as uv'),
DB::raw('count(a1) as pv')
)
->limit(1)
->get()
->map(function ($value) {return (array)$value;})
->toArray();
return $resp[0];
}