
本文将详细介绍如何在 laravel 8 应用中,通过路由参数实现对特定组的周报数据进行过滤显示,并允许用户为该组创建新的周报。我们将探讨路由定义、控制器参数接收、数据库查询过滤以及如何在视图中正确生成链接,确保用户体验流畅且数据关联准确。
在开发管理系统时,经常会遇到需要根据父级实体(如“组”)来展示其子级实体(如“周报”)的场景。用户点击某个组旁边的“周报”按钮时,期望看到的是该组专属的周报列表,并且能够为该组创建新的周报,而不是显示所有周报。本文将指导您如何利用 Laravel 的路由系统和控制器逻辑来实现这一功能。
最初的问题在于,尽管前端链接试图传递 group_id,但控制器中的 index 方法并未接收此参数,导致始终显示所有周报。同时,创建新周报时也需要确保其与正确的组关联。解决方案涉及以下几个关键步骤:
首先,我们需要在 routes/web.php 文件中定义一个能够接收 group_id 参数的 GET 路由。
// routes/web.php
use App\Http\Controllers\WeeklyreportController;
// 定义显示特定组周报的路由
Route::get('/weeklyreports/{groupId}', [WeeklyreportController::class, 'index'])
->name('weeklyreports.group_index'); // 建议为路由命名,方便后续引用
// 定义为特定组创建周报的路由
Route::get('/weeklyreports/{groupId}/create', [WeeklyreportController::class, 'create'])
->name('weeklyreports.group_create');
// 定义存储特定组周报的路由
Route::post('/weeklyreports/{groupId}', [WeeklyreportController::class, 'store'])
->name('weeklyreports.group_store');
// 如果您仍然需要一个显示所有周报的路由,可以保留或重新定义
// Route::resource('weeklyreports', WeeklyreportController::class); // 示例,如果使用资源路由注意事项:
接下来,修改 WeeklyreportController 中的 index 方法,使其能够接收并使用 groupId 参数来过滤周报。
// app/Http/Controllers/WeeklyreportController.php
<?php
namespace App\Http\Controllers;
use App\Models\Weeklyreport;
use App\Models\Group; // 假设您有一个 Group 模型
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class WeeklyreportController extends Controller
{
/**
* 显示特定组的周报列表。
*
* @param int $groupId 从路由中获取的组ID
* @return \Illuminate\Http\Response
*/
public function index(int $groupId)
{
// 验证组是否存在 (可选但推荐)
$group = Group::find($groupId);
if (!$group) {
abort(404, 'Group not found.');
}
// 根据 groupId 过滤周报数据,假设 Weeklyreport 模型中有一个 'gpid' 字段来关联组ID
$weeklyreports = Weeklyreport::latest()
->where('gpid', $groupId) // 使用路由参数 $groupId 过滤结果
->paginate(5);
return view('weeklyreports.index', compact('weeklyreports', 'groupId'))
->with('i', (request()->input('page', 1) - 1) * 5);
}
/**
* 显示为特定组创建新周报的表单。
*
* @param int $groupId 从路由中获取的组ID
* @return \Illuminate\Http\Response
*/
public function create(int $groupId)
{
// 验证组是否存在 (可选但推荐)
$group = Group::find($groupId);
if (!$group) {
abort(404, 'Group not found.');
}
// 将 groupId 传递给视图,以便在创建表单中使用
return view('weeklyreports.create', compact('groupId'));
}
/**
* 存储为特定组创建的新周报。
*
* @param \Illuminate\Http\Request $request
* @param int $groupId 从路由中获取的组ID
* @return \Illuminate\Http\Response
*/
public function store(Request $request, int $groupId)
{
// 验证组是否存在 (可选但推荐)
$group = Group::find($groupId);
if (!$group) {
abort(404, 'Group not found.');
}
request()->validate([
'name' => 'required',
'date' => 'required',
'time' => 'required',
'work_sub' => 'required',
'work_under' => 'required',
'issue' => 'required',
'topic' => 'required',
'work_std' => 'required',
'next_date' => 'required',
'next_time' => 'required',
]);
$weeklyreport = new Weeklyreport;
// 填充周报数据
$weeklyreport->name = $request->input('name');
$weeklyreport->date = $request->input('date');
$weeklyreport->time = $request->input('time');
$weeklyreport->work_sub = $request->input('work_sub');
$weeklyreport->work_under = $request->input('work_under');
$weeklyreport->issue = $request->input('issue');
$weeklyreport->topic = $request->input('topic');
$weeklyreport->work_std = $request->input('work_std');
$weeklyreport->next_date = $request->input('next_date');
$weeklyreport->next_time = $request->input('next_time');
// 关联组ID
$weeklyreport->gpid = $groupId; // 确保将当前组ID赋给周报
$weeklyreport->save();
// 处理 attendance 逻辑 (根据原始代码保留)
$rr = DB::table('weeklyreports')->orderBy('created_at', 'desc')->first();
if ($request->has('student_id') && is_array($request->student_id)) {
$student_id_data = [];
foreach ($request->student_id as $id) {
$student_id_data[] = [
'week_id' => $weeklyreport->id,
'student_id' => $id,
];
}
DB::table('attendance')->insert($student_id_data);
}
return redirect()->route('weeklyreports.group_index', $groupId) // 重定向回当前组的周报列表
->with('success', 'Weeklyreport created successfully.');
}
}关键点:
在您的组列表视图(例如 supervisor_index.blade.php 或 groups.index.blade.php)中,确保“周报”按钮的链接能够正确传递 group_id。
<!-- groups.index.blade.php (或类似文件) -->
<!-- 假设您正在循环显示组数据,并且 $group->id 是当前组的ID -->
<a class="btn btn-primary" href="{{ route('weeklyreports.group_index', $group->id) }}">
Weekly Report
</a>
<!-- 如果您想添加一个创建周报的按钮,也需要传递 groupId -->
<a class="btn btn-success" href="{{ route('weeklyreports.group_create', $group->id) }}">
Create Weekly Report
</a>注意事项:
在 weeklyreports/create.blade.php 视图中,您可能需要一个隐藏字段来传递 groupId,或者在提交表单时确保 groupId 能够被 store 方法接收。由于我们的 store 方法直接从路由中获取 groupId,所以视图中不需要额外的隐藏字段,但可以用于显示当前所属组的信息。
<!-- weeklyreports/create.blade.php -->
<form action="{{ route('weeklyreports.group_store', $groupId) }}" method="POST">
@csrf
<!-- 可以在这里显示当前组的信息,例如: -->
<p>正在为组 ID: {{ $groupId }} 创建周报</p>
<!-- 其他表单字段 -->
<div class="form-group">
<label for="name">名称:</label>
<input type="text" name="name" id="name" class="form-control" required>
</div>
<!-- ... 其他输入字段 ... -->
<button type="submit" class="btn btn-success">提交周报</button>
</form>通过以上步骤,您已经成功地实现了在 Laravel 8 中根据路由参数过滤和创建特定组的周报功能。
总结要点:
进一步优化:
遵循这些实践,您的 Laravel 应用将更加健壮、易于维护和扩展。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号