You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel9赛事注册系统特定用户赛事状态展示功能求助

实现步骤

1. 完善模型关联关系

先确保各模型的关联定义正确,这是后续查询的基础:

Registration 模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Registration extends Model
{
    // 关联用户
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    // 关联赛事(多对多,指定中间表及字段)
    public function tournaments(): BelongsToMany
    {
        return $this->belongsToMany(Tournament::class, 'reg_tours', 'registrations_id', 'tournaments_id');
    }

    // 关联匹配(status_id 作为外键关联match表)
    public function match(): BelongsTo
    {
        return $this->belongsTo(Match::class, 'status_id');
    }
}

Tournament 模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Tournament extends Model
{
    // 关联注册记录(多对多,指定中间表及字段)
    public function registrations(): BelongsToMany
    {
        return $this->belongsToMany(Registration::class, 'reg_tours', 'tournaments_id', 'registrations_id');
    }
}

2. 修改 Tournament Controller

在singleTournament方法中,获取当前用户对该赛事的注册记录并传递给视图:

public function singleTournament($id) {
    $game = Game::all();
    // 用findOrFail替代find,赛事不存在时直接返回404
    $data = Tournament::findOrFail($id);

    // 简化队伍规模转换逻辑
    $teamSizeMap = [1 => 'Solo', 2 => 'Duo', 4 => 'Squad'];
    $data->teamsize = $teamSizeMap[$data->teamsize] ?? $data->teamsize;

    // 获取当前用户的注册记录(仅用户登录时查询)
    $userRegistration = null;
    if (auth()->check()) {
        $userRegistration = $data->registrations()
            ->where('user_id', auth()->id())
            ->with('match') // 预加载关联的match,避免N+1查询
            ->first();
    }

    return view('site.tournament', compact('data', 'game', 'userRegistration'));
}

3. 在视图中渲染注册状态

在site/tournament.blade.php中,根据注册记录的状态展示对应内容:

{{-- 注册状态展示区域 --}}
<div class="registration-status">
    @if($userRegistration)
        @if($userRegistration->status_id == 0)
            <p>您已注册</p>
        @else
            @if($userRegistration->match)
                <p>您已分配至:{{ $userRegistration->match->name }}</p>
            @else
                <p>匹配信息不存在</p>
            @endif
        @endif
    @else
        {{-- 未登录或未注册时的提示,可根据需求添加注册按钮 --}}
        <p>您尚未注册该赛事</p>
    @endif
</div>

关键说明

  • 使用findOrFail替代find,能在赛事不存在时直接返回404错误,优化异常场景处理。
  • 预加载match关联,避免视图中重复查询数据库引发的性能问题。
  • 通过auth()->check()判断用户登录状态,未登录时跳过注册记录查询,减少无效请求。

内容的提问来源于stack exchange,提问作者Afaq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:16:05