hasMany(GameConsumeItem::class, 'group_id', 'id'); } /** * 获取关联的标签(多态关联) * * @return \Illuminate\Database\Eloquent\Relations\MorphToMany */ public function tags() { return $this->morphToMany(GameTag::class, 'taggable', 'game_tag_relations', 'taggable_id', 'tag_id'); } /** * 格式化消耗详情用于显示 * * @return string */ public function formatConsumeDetails(): string { if ($this->consumeItems->isEmpty()) { return '暂无消耗项'; } $details = []; foreach ($this->consumeItems as $item) { $detail = $this->formatSingleConsumeItem($item); $details[] = $detail; } return '
' . implode('
', $details) . '
'; } /** * 格式化标签用于显示 * * @return string */ public function formatTags(): string { if ($this->tags->isEmpty()) { return '无标签'; } $tagHtml = []; foreach ($this->tags as $tag) { $tagHtml[] = $tag->formatTag(); } return implode(' ', $tagHtml); } /** * 格式化单个消耗项 * * @param GameConsumeItem $item * @return string */ private function formatSingleConsumeItem(GameConsumeItem $item): string { $consumeTypeName = \App\Module\Game\Enums\CONSUME_TYPE::getName($item->consume_type); $targetName = $this->getTargetName($item); $quantity = $item->quantity; return sprintf( '%s %s × %d', $consumeTypeName, $targetName, $quantity ); } /** * 获取目标名称 * * @param GameConsumeItem $item * @return string */ private function getTargetName(GameConsumeItem $item): string { switch ($item->consume_type) { case \App\Module\Game\Enums\CONSUME_TYPE::ITEM->value: try { $itemModel = \App\Module\GameItems\Models\Item::find($item->target_id); return $itemModel ? $itemModel->name : "物品 (ID: {$item->target_id})"; } catch (\Exception $e) { return "物品 (ID: {$item->target_id})"; } case \App\Module\Game\Enums\CONSUME_TYPE::CURRENCY->value: try { $currency = \App\Module\Fund\Models\FundCurrencyModel::find($item->target_id); return $currency ? $currency->name : "货币 (ID: {$item->target_id})"; } catch (\Exception $e) { return "货币 (ID: {$item->target_id})"; } case \App\Module\Game\Enums\CONSUME_TYPE::FUND_CONFIG->value: try { $fund = \App\Module\Fund\Models\FundConfigModel::find($item->target_id); return $fund ? $fund->name : "账户种类 (ID: {$item->target_id})"; } catch (\Exception $e) { return "账户种类 (ID: {$item->target_id})"; } case \App\Module\Game\Enums\CONSUME_TYPE::FUND_CONFIGS->value: // 直接使用 GameConsumeItem 模型的 getTargetName 方法 return $item->getTargetName(); default: return "未知消耗类型 (ID: {$item->target_id})"; } } }