Laravel 8:实现按组ID筛选和创建周报的完整指南
引言
在企业级应用中,周报系统是常见的需求。本文将详细介绍如何在 Laravel 8 中实现按组 ID 筛选用户并创建周报的功能。我们将涵盖从数据库设计到前端展示的完整流程。
环境准备
确保已安装以下组件:
- Laravel 8.x
- PHP 7.3+
- MySQL 5.7+
- Composer
数据库设计
我们需要以下数据表:
| 表名 | 字段 | 说明 |
|---|---|---|
| users | id, name, email, group_id | 用户表,包含组ID关联 |
| groups | id, name | 用户组表 |
| weekly_reports | id, user_id, title, content, week_start, week_end, created_at | 周报表,记录用户每周报告 |
迁移文件示例
// database/migrations/xxxx_xx_xx_xxxxxx_create_weekly_reports_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateWeeklyReportsTable extends Migration
{
public function up()
{
Schema::create('weekly_reports', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->string('title');
$table->text('content');
$table->date('week_start');
$table->date('week_end');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down()
{
Schema::dropIfExists('weekly_reports');
}
}模型关系定义
在 Eloquent 模型中定义关联关系:
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory;
protected $fillable = ['name', 'email', 'group_id'];
// 用户属于一个组
public function group()
{
return $this->belongsTo(Group::class);
}
// 用户有多篇周报
public function weeklyReports()
{
return $this->hasMany(WeeklyReport::class);
}
}// app/Models/Group.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
{
use HasFactory;
protected $fillable = ['name'];
// 组有多个用户
public function users()
{
return $this->hasMany(User::class);
}
}// app/Models/WeeklyReport.php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class WeeklyReport extends Model
{
use HasFactory;
protected $fillable = ['user_id', 'title', 'content', 'week_start', 'week_end'];
// 周报属于一个用户
public function user()
{
return $this->belongsTo(User::class);
}
}控制器实现
创建周报控制器处理业务逻辑:
// app/Http/Controllers/WeeklyReportController.php
namespace App\Http\Controllers;
use App\Models\Group;
use App\Models\User;
use App\Models\WeeklyReport;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class WeeklyReportController extends Controller
{
// 显示周报创建表单
public function create()
{
$groups = Group::all();
return view('weekly_reports.create', compact('groups'));
}
// 按组筛选用户并显示周报列表
public function index(Request $request)
{
$groupId = $request->input('group_id');
$query = WeeklyReport::with(['user.group'])
->orderBy('week_start', 'desc');
if ($groupId) {
$query->whereHas('user', function($q) use ($groupId) {
$q->where('group_id', $groupId);
});
}
$reports = $query->paginate(10);
$groups = Group::all();
return view('weekly_reports.index', compact('reports', 'groups', 'groupId'));
}
// 存储新周报
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'week_start' => 'required|date',
'week_end' => 'required|date|after_or_equal:week_start',
]);
// 自动关联当前用户
$validated['user_id'] = Auth::id();
WeeklyReport::create($validated);
return redirect()->route('weekly_reports.index')
->with('success', '周报创建成功!');
}
}路由配置
在 routes/web.php 中添加路由:
use App\Http\Controllers\WeeklyReportController;
Route::get('/weekly-reports', [WeeklyReportController::class, 'index'])->name('weekly_reports.index');
Route::get('/weekly-reports/create', [WeeklyReportController::class, 'create'])->name('weekly_reports.create');
Route::post('/weekly-reports', [WeeklyReportController::class, 'store'])->name('weekly_reports.store');视图实现
创建周报相关的 Blade 模板:
创建周报表单
<!-- resources/views/weekly_reports/create.blade.php -->
@extends('layouts.app')
@section('content')周报列表与筛选
<!-- resources/views/weekly_reports/index.blade.php -->
@extends('layouts.app')
@section('content')功能增强建议
- 添加周报编辑和删除功能
- 实现周报状态管理(草稿、已提交、已审核)
- 添加周报搜索功能
- 实现周报导出为 PDF 或 Excel
- 添加周报评论和反馈功能
- 设置定时任务自动提醒用户提交周报
总结
本文详细介绍了在 Laravel 8 中实现按组 ID 筛选和创建周报系统的完整流程。通过合理的数据库设计、模型关系定义和控制器逻辑,我们构建了一个功能完善的周报管理系统。这个基础架构可以根据实际需求进一步扩展和优化。