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})";
}
}
}