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

如何将jQuery Sortable排序结果传递给Laravel控制器并调整文章优先级?

实现文章拖拽排序并更新Laravel中的Priority属性

没问题,咱们一步步来搞定这个功能——既然已经引入了jQuery,只需要补个Sortable组件,再配合Laravel后端处理逻辑就行:

1. 完善Blade模板,绑定文章ID

首先得让每个列表项对应到具体的Article对象,咱们给<li>加上data-id属性,把文章ID存进去:

<ul class="selectable-demo-list" id="sortable-list-basic">
    @foreach($articles as $article)
        <li data-id="{{ $article->id }}">
            {{ $article->label }}
        </li>
    @endforeach
</ul>

2. 引入jQuery UI Sortable并初始化排序

原生jQuery没有拖拽排序功能,咱们需要引入jQuery UI的Sortable模块。你可以通过CDN快速引入(放在jQuery之后):

<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>

然后写前端JS代码,初始化排序组件,并在排序结束后发送请求到后端:

$(document).ready(function() {
    // 初始化拖拽排序
    $('#sortable-list-basic').sortable({
        animation: 150, // 可选:添加拖拽时的动画,提升体验
        cursor: 'move', // 光标样式改成移动图标
        // 排序完成后触发的回调
        stop: function() {
            // 收集排序后的所有文章ID
            const sortedIds = $('#sortable-list-basic li').map(function() {
                return $(this).data('id');
            }).get();

            // 发送AJAX请求更新优先级
            $.ajax({
                url: '{{ route('articles.update-priority') }}', // 对应后端路由
                method: 'POST',
                data: {
                    _token: '{{ csrf_token() }}', // 必须带Laravel的CSRF令牌
                    article_ids: sortedIds
                },
                success: function(res) {
                    if (res.success) {
                        alert('排序已成功保存!');
                        // 可选:如果需要实时更新页面,这里可以做相应处理
                    } else {
                        alert('保存失败,请重试');
                    }
                },
                error: function() {
                    alert('网络出错啦,请稍后再试');
                }
            });
        }
    });

    // 可选:禁用文本选中,避免拖拽时选中文字
    $('#sortable-list-basic').disableSelection();
});

3. 配置Laravel路由

在routes/web.php里添加一个POST路由,指向控制器的处理方法:

use App\Http\Controllers\ArticleController;

Route::post('/articles/update-priority', [ArticleController::class, 'updatePriority'])->name('articles.update-priority');

4. 编写控制器的更新逻辑

在ArticleController里添加updatePriority方法,这里要注意用事务确保所有更新要么成功要么回滚,避免数据不一致:

use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

public function updatePriority(Request $request)
{
    // 验证请求数据:必须是数组,且每个ID都存在于articles表
    $request->validate([
        'article_ids' => 'required|array',
        'article_ids.*' => 'exists:articles,id'
    ]);

    // 使用数据库事务保证原子性
    DB::transaction(function () use ($request) {
        // 遍历排序后的ID,更新对应的priority值(从1开始计数,你也可以改成从0)
        foreach ($request->article_ids as $priority => $articleId) {
            Article::where('id', $articleId)->update([
                'priority' => $priority + 1
            ]);
        }
    });

    return response()->json(['success' => true]);
}

一些额外的小提示

  • 样式优化:可以给排序中的列表项加个高亮样式,比如通过Sortable的start和stop回调添加/移除CSS类,让用户更直观看到拖拽状态。
  • 错误处理:生产环境中,可以在控制器里捕获异常,返回更具体的错误信息,方便调试。
  • 权限控制:记得给这个路由加上管理员权限验证,避免未授权用户修改排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:03