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
相关产品推荐
相关产品推荐

