Laravel工单创建者与经办人显示同一用户的问题排查
Laravel工单系统createdBy与assignedTo显示同一用户的问题排查与解决
问题原因
- 数据库字段缺失:Ticket表仅存在
user_id字段,未单独存储经办人ID,导致创建者与经办人数据共用同一字段。 - 模型关联错误:
createdBy和assignedTo两个关联方法均指向user_id字段,查询时自然返回同一用户。 - 控制器逻辑错误:代码中先将
user_id赋值为请求的经办人ID,随后又被Auth::id()(当前登录用户,即创建者)覆盖,经办人ID根本未被保存。
解决方案
1. 修改Ticket表结构,添加经办人字段
首先生成新的迁移文件:
php artisan make:migration add_assigned_user_id_to_tickets_table
编辑生成的迁移文件,添加经办人字段并修正字段类型规范:
public function up() { Schema::table('tickets', function (Blueprint $table) { // 添加经办人ID字段 $table->unsignedBigInteger('assigned_user_id')->nullable(); // 将原user_id修改为与User模型id匹配的类型 $table->unsignedBigInteger('user_id')->nullable()->change(); // 添加外键约束(可选,增强数据完整性) $table->foreign('assigned_user_id')->references('id')->on('users')->onDelete('set null'); $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); }); } public function down() { Schema::table('tickets', function (Blueprint $table) { $table->dropForeign(['assigned_user_id']); $table->dropColumn('assigned_user_id'); // 回滚user_id字段类型 $table->string('user_id')->nullable()->change(); }); }
运行迁移生效:
php artisan migrate
2. 更新Ticket模型的关联关系
修改assignedTo方法,使其关联新添加的assigned_user_id字段:
class Ticket extends Model { // ... 其他原有代码 public function user(){ return $this->belongsTo(User::class,"user_id"); } public function createdBy() { return $this->belongsTo(User::class, 'user_id'); } public function tier() { return $this->belongsTo(Tier::class, 'tier_id'); } // 关联经办人字段 public function assignedTo() { return $this->belongsTo(User::class, 'assigned_user_id'); } }
3. 修正控制器的存储逻辑
确保创建者ID和经办人ID分别保存到对应字段,同时添加经办人ID的验证规则:
public function store(Request $request) { $validated = $request->validate([ "ref_ticket"=>['required','min:3'], "user_ticket"=>['required', 'exists:users,id'], // 验证经办人ID合法 ]); $verification = Affaire::where('reference', '=', $request->ref_ticket); if($verification->count() > 0){ return back()->with("error","Ce ticket ". $request->ref_ticket ." existe déjà veuillez le changer."); }else{ $ticket = new Ticket(); $ticket->ref = $request->ref_ticket; $ticket->type_demande = $request->demande; $ticket->categorisation = $request->categorie; $ticket->severite = $request->severite_ticket; $ticket->sujet = $request->sujet_ticket; $ticket->fichier_joint = $request->fichier_joint_ticket; $ticket->message = $request->message_ticket; $ticket->progression = $request->progression_ticket; $ticket->date_cloture = $request->date_cloture_ticket; $ticket->etat = 'Assigné'; $ticket->affaire_id = $request->affaire_ticket; $ticket->tier_id = $request->tier_ticket; // 保存经办人ID到assigned_user_id $ticket->assigned_user_id = $request->user_ticket; // 保存创建者ID为当前登录用户 $ticket->user_id = Auth::id(); $ticket->save(); return back()->with("success","Ticket ". $request->ref_ticket ." enrégistré avec succès."); } }
4. 优化查询避免N+1问题
在获取工单列表时,预加载关联模型提升页面性能:
// 示例列表控制器方法 public function index() { $tickets = Ticket::with(['createdBy', 'assignedTo', 'tier'])->get(); return view('tickets.index', compact('tickets')); }
内容的提问来源于stack exchange,提问作者alban
相关产品推荐
相关产品推荐

