(string)$filters]; } $keyword = trim($filters['keyword'] ?? ''); $groupId = (int)($filters['id'] ?? 0); $gameId = (int)($filters['game_id'] ?? 0); $status = $filters['status'] ?? ''; $platform = trim($filters['platform'] ?? ''); $query = $this->alias('gb') ->field('gb.*, ag.name as android_game_name, ig.name as ios_game_name, hg.name as h5_game_name') ->join('cy_game ag', 'ag.id = gb.android_game_id', 'LEFT') ->join('cy_game ig', 'ig.id = gb.ios_game_id', 'LEFT') ->join('cy_game hg', 'hg.id = gb.h5_game_id', 'LEFT') ->order('gb.id desc'); if ($groupId > 0) { $query->where('gb.id', $groupId); } if ($gameId > 0) { $query->where(function ($q) use ($gameId) { $q->where('gb.android_game_id', $gameId) ->whereOr('gb.ios_game_id', $gameId) ->whereOr('gb.h5_game_id', $gameId); }); } if ($status !== '' && $status !== null) { $query->where('gb.status', (int)$status); } switch ($platform) { case 'android': $query->where('gb.android_game_id', '>', 0); break; case 'ios': $query->where('gb.ios_game_id', '>', 0); break; case 'h5': $query->where('gb.h5_game_id', '>', 0); break; case 'unbound': $query->where('gb.android_game_id', 0) ->where('gb.ios_game_id', 0) ->where('gb.h5_game_id', 0); break; } if ($keyword !== '') { if (ctype_digit($keyword)) { $query->where(function ($q) use ($keyword) { $q->where('gb.id', (int)$keyword) ->whereOr('gb.android_game_id', (int)$keyword) ->whereOr('gb.ios_game_id', (int)$keyword) ->whereOr('gb.h5_game_id', (int)$keyword) ->whereOr('gb.game_name|ag.name|ig.name|hg.name', 'like', "%{$keyword}%"); }); } else { $query->where('gb.game_name|ag.name|ig.name|hg.name', 'like', "%{$keyword}%"); } } $list = $query->paginate(20, false, ['query' => request()->param()]); $list->each(function ($item) { $item['display_name'] = self::resolveDisplayName($item); $item['bind_count'] = self::countBindings($item); return $item; }); return $list; } /** * 获取单个分组详情 */ public function getGroupDetail($id) { $detail = $this->alias('gb') ->field('gb.*, ag.name as android_game_name, ig.name as ios_game_name, hg.name as h5_game_name') ->join('cy_game ag', 'ag.id = gb.android_game_id', 'LEFT') ->join('cy_game ig', 'ig.id = gb.ios_game_id', 'LEFT') ->join('cy_game hg', 'hg.id = gb.h5_game_id', 'LEFT') ->where('gb.id', $id) ->find(); if ($detail) { $detail['display_name'] = self::resolveDisplayName($detail); } return $detail; } /** * 解析展示名称:优先 game_name,否则从已绑定游戏名推导 */ public static function resolveDisplayName($row) { $name = trim($row['game_name'] ?? ''); if ($name !== '') { return $name; } foreach (['android_game_name', 'ios_game_name', 'h5_game_name'] as $field) { $gameName = trim($row[$field] ?? ''); if ($gameName === '') { continue; } $clean = preg_replace('/\s*[\((](?:安卓|Android|IOS|ios|iOS|H5|h5)[\))]\s*$/iu', '', $gameName); $clean = preg_replace('/\s*[-—]?\s*(安卓|Android|IOS|ios|iOS|H5|h5)\s*$/iu', '', $clean); $clean = trim($clean); if ($clean !== '') { return $clean; } } return '未命名游戏组#' . ($row['id'] ?? 0); } /** * 统计已绑定平台数量 */ public static function countBindings($row) { $count = 0; if (!empty($row['android_game_id'])) { $count++; } if (!empty($row['ios_game_id'])) { $count++; } if (!empty($row['h5_game_id'])) { $count++; } return $count; } /** * 获取状态文本 */ public function getStatusTextAttr($value, $data) { $status = [ self::STATUS_DISABLE => '禁用', self::STATUS_ENABLE => '启用', ]; return $status[$data['status']] ?? '未知'; } }