leftJoin('bps_google_ad_day_data d', 'a.ad_id = d.ad_id') ->field('a.ad_id, a.ad_name, a.status as ad_status, a.customer_id, SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, SUM(d.impressions) as impressions') ->group('a.ad_id') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('a.ad_name', 'like', '%' . $keyword . '%'); } }); // 根据日期维度添加聚合条件 switch ($dateRange) { case 'Today': $query->where('d.date', '=', date('Y-m-d')); break; case 'Yesterday': $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); break; case 'Last Week': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); break; case 'Last Month': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); break; case 'Last Year': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); break; default: break; } // 获取分页数据 $ads = $query->paginate($pageSize, false, ['page' => $page]); // 返回分页和总数信息 return [ 'data' => $ads->items(), 'total' => $ads->total(), 'current_page' => $ads->currentPage(), 'last_page' => $ads->lastPage(), ]; } /** * 获取广告系列列表 */ public static function getCampaignList($page, $pageSize, $keyword, $dateRange) { // 基础查询:广告活动和日数据表联接 $query = Campaign::alias('c') ->leftJoin('bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id') ->field('c.campaign_id, c.status as campaign_status, c.customer_id, SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, SUM(d.impressions) as impressions') ->group('c.campaign_id') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); } }); // 根据日期维度添加聚合条件 switch ($dateRange) { case 'Today': $query->where('d.date', '=', date('Y-m-d')); break; case 'Yesterday': $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); break; case 'Last Week': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); break; case 'Last Month': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); break; case 'Last Year': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); break; default: break; } // 获取分页数据 $campaigns = $query->paginate($pageSize, false, ['page' => $page]); // 返回分页和总数信息 return [ 'data' => $campaigns->items(), 'total' => $campaigns->total(), 'current_page' => $campaigns->currentPage(), 'last_page' => $campaigns->lastPage(), ]; } /** * 获取广告系列列表 */ public static function getAdGroupList($page, $pageSize, $keyword, $dateRange) { // 初始化查询 $query = AdGroup::alias('ag') ->leftJoin('bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id') ->field('ag.ad_group_id, ag.campaign_id, ag.customer_id, SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, SUM(d.impressions) as impressions') ->group('ag.ad_group_id') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%'); } }); // 根据日期范围添加聚合条件 switch ($dateRange) { case 'Today': $query->where('d.date', '=', date('Y-m-d')); break; case 'Yesterday': $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); break; case 'Last Week': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); break; case 'Last Month': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); break; case 'Last Year': $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); break; default: break; } // 分页查询 try { // $sql = $query->fetchSql()->select(); // fetchSql() 会返回 SQL 查询语句 // echo "Executed SQL: " . $sql; // 输出执行的 SQL $result = $query->paginate([ 'list_rows' => $pageSize, // 每页数量 'page' => $page, // 当前页码 ]); // 返回分页数据 return [ 'data' => $result->items(), 'total' => $result->total(), 'current_page' => $result->currentPage(), 'last_page' => $result->lastPage(), ]; } catch (DbException $e) { // 处理数据库查询错误 return [ 'error' => 'Database query failed: ' . $e->getMessage(), ]; } } }