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

Laravel中AJAX提交多选课程无法更新用户关联课程求助

问题:用户信息更新正常,但关联课程未更新

我尝试使用AJAX为用户添加多门课程,点击提交按钮后,用户姓名、邮箱等信息均可正常更新,但关联的课程未更新,请求帮助。

Blade视图代码

<input type="hidden" name="user_id" id="user_id" value="{{$user_details->id}}">
@csrf
<div class="form-group">
    <label for="name">Name</label>
    <input type="text" class="form-control"  id="name"  name="name" value="{{$user_details->name}}">
</div>
<div class="form-group">
    <label for="email">Email</label>
    <input type="text" class="form-control"  id="email"  name="email" value="{{$user_details->email}}">
</div>
<div class="form-group">
    <label for="courses_id">Courses</label>
    @php
        $all_courses = $user_details->courses_id;
    @endphp
    <select name="courses_id[]" multiple id="course" class="form-control nice-select wide">
    @foreach($courses as $data)
    @if($all_courses)
        <option @if(in_array($data->id,$all_courses)) selected @endif value="{{$data->id}}">{{$data->title}}</option>
    @else
        <option value="{{$data->id}}">{{$data->title}}</option>
    @endif
    @endforeach
    </select>
</div>
<button type="submit" class="btn btn-primary mt-4 pr-4 pl-4">{{__('Update User')}}</button>
</form>

<script>
    $(document).ready(function() {

        if($('.nice-select').length > 0){
            $('.nice-select').niceSelect();
        }

        $(document).on('change','select[name="courses_id[]"]',function (e) {
            e.preventDefault();
            var selectedId = $(this).val();
            $.ajax({
                url : "{{route('admin.user.course.by.slug')}}",
                type: "POST",
                data: {
                    _token : "{{csrf_token()}}",
                    id: selectedId
                },
                success:function (data) {
                    $('#course').html('');
                    $.each(data,function (index,value) {
                        $('#course').append('<option '+selected+' value="'+value.id+'">'+value.title+'</option>');
                        $('.nice-select').niceSelect('update');
                    });
                }
            });
        });
    } );
</script>

控制器代码

namespace App\Http\Controllers;

use App\Courses;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    public function edit($id)
    {
        $user_details = User::find($id);
        $courses = Courses::where(['status'=> 'publish'])->get();

        return view('backend.user.edit-user')->with([ 'user_details' => $user_details, 'courses' => $courses]);
    }

    public function user_update(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|string|max:191',
            'email' => 'required|string|max:191',
            'courses_id' => 'nullable',
        ],[
            'name.required' => __('Name is required'),
            'email.required' => __('Email is required'),
        ]);

        User::find($request->user_id)->update([
            'name' => $request->name,
            'email' => $request->email,
            'courses_id' => serialize($request->courses_id),
        ]);

        return redirect()->back()->with(['msg' => __('User Profile Updated Successfully..'), 'type' => 'success']);
    }

    public function course_by_slug(Request $request){
        $all_courses = Courses::where(['status' => 'publish'])->get();
        return response()->json($all_courses);
    }
}

路由代码

Route::prefix('user')->middleware(['adminPermissionCheck:Users Manage'])->group(function () {
Route::get('/edit/{id}', 'UserController@edit')->name('admin.user.edit');
Route::post('/update', 'UserController@user_update')->name('admin.user.update');
Route::post('/course-by-slug', 'UserController@course_by_slug')->name('admin.user.course.by.slug');
});

问题排查与解决方案

1. 修复编辑页面课程选中状态判断错误

Blade视图中直接读取了数据库里序列化后的字符串作为$all_courses,但in_array需要数组才能正确匹配,导致编辑页面无法显示用户已选课程,提交时可能因选中状态丢失无数据传递。

修改Blade中的@php代码:

@php
    // 反序列化存储的课程ID数组,为空时返回空数组
    $all_courses = $user_details->courses_id ? unserialize($user_details->courses_id) : [];
@endphp

2. 移除无意义的AJAX事件

绑定的select change事件只是重复获取所有已发布课程,且回调中selected变量未定义,导致重新渲染后选中状态丢失,直接删除这段代码即可:

删除以下脚本片段:

$(document).on('change','select[name="courses_id[]"]',function (e) {
    e.preventDefault();
    var selectedId = $(this).val();
    $.ajax({
        url : "{{route('admin.user.course.by.slug')}}",
        type: "POST",
        data: {
            _token : "{{csrf_token()}}",
            id: selectedId
        },
        success:function (data) {
            $('#course').html('');
            $.each(data,function (index,value) {
                $('#course').append('<option '+selected+' value="'+value.id+'">'+value.title+'</option>');
                $('.nice-select').niceSelect('update');
            });
        }
    });
});

3. 验证表单提交数据

在控制器user_update方法中添加调试代码,确认是否接收到课程ID数组:

// 在update操作前添加
dd($request->courses_id);

如果输出为null,检查nice-select插件是否同步了原select的选中状态,或禁用插件用原生select测试提交情况。

4. 检查数据库字段类型

确保users表的courses_id字段类型为text或longtext,序列化后的数组可能超过varchar长度限制,导致存储截断、后续反序列化失败。

内容的提问来源于stack exchange,提问作者Brenden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:58:03