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

Laravel控制器AJAX分页请求始终返回第1页结果问题

Laravel AJAX无限滚动分页始终返回第1页问题修复

问题背景

实现用户搜索功能,基础搜索与Laravel分页正常,但添加AJAX无限滚动后,控制器始终返回第1页结果,排查发现$request->input('page')为空。

错误原因

观察构造的AJAX请求URL:

http://127.0.0.1:8000/search?interestedin=Sugar+Mommy&...&longitude=74.397301?page=2

URL中出现两个问号?,第二个?会被浏览器当作普通字符处理,导致page参数无法被Laravel的Request正确解析,后端只能使用默认值1。

修复方案

前端代码修复

核心是正确拼接分页参数,避免重复使用?,推荐用URLSearchParams管理查询参数,确保参数拼接逻辑正确:

<script>
    var ENDPOINT = "{{ route('search') }}";
    var isLoading = false;
    var currentPage = 1;
    var totalPages = "{{ $users->lastPage() }}";
    // 保留原搜索条件的查询参数
    var searchParams = new URLSearchParams(window.location.search);

    $(window).scroll(function() {
        var container = $("#user-cards-container");
        var containerHeight = container.height();
        var scrollTop = $(window).scrollTop();
        var windowHeight = $(window).height();

        if (!isLoading && currentPage < totalPages && scrollTop + windowHeight >= container.offset().top + containerHeight - 20) {
            currentPage++;
            infinteLoadMore(currentPage);
        }
    });

    function infinteLoadMore(page) {
        // 更新分页参数
        searchParams.set('page', page);
        var url = ENDPOINT + '?' + searchParams.toString();
        console.log("Constructed URL: " + url);
        
        isLoading = true;
        $.ajax({
                url: url,
                datatype: "html",
                type: "get",
                beforeSend: function() {
                    $('.auto-load').show();
                }
            })
            .done(function(response) {
                if (!response.html) {
                    $('.auto-load').html("No more data to display.");
                    isLoading = false;
                    return;
                }

                $('.auto-load').hide();
                $("#user-cards-container").append(response.html);
                // 可选:更新总页数(适配搜索结果总数变化的场景)
                if (response.lastPage) {
                    totalPages = response.lastPage;
                }
                isLoading = false;
            })
            .fail(function(jqXHR, ajaxOptions, thrownError) {
                console.log('Server error occurred');
                isLoading = false;
            });
    }
</script>

后端代码优化(可选)

后端原有逻辑可行,可简化分页参数处理,Laravel的paginate方法会自动从Request中获取page参数并使用默认值1:

public function search(Request $request)
{
    $query = User::query()
        ->where('id', '!=', Auth::id()) // 排除已认证用户
        ->where('status', '!=', 0); // 排除被封禁用户

    // 原有过滤逻辑保持不变...

    // 无需手动传入$page,paginate自动处理参数
    $users = $query->paginate(9);

    if ($request->ajax()) {
        $view = view('user.member_card', compact('users'))->render();
        return response()->json([
            'html' => $view,
            'lastPage' => $users->lastPage()
        ]);
    }

    return view('user.search', compact('users'));
}

额外注意点

  • 确保member_card.blade.php仅渲染用户卡片列表,不包含外层容器,避免重复添加结构
  • 可根据页面实际布局调整滚动触发的阈值,避免误触发加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:02:07