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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:43:21