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

Eloquent with()关联where失效:分页加载页面链接重复问题

解决分页加载链接时Where条件未生效的问题

看起来你遇到了分页加载时重复返回相同链接的坑,我来帮你一步步排查和解决:

首先排查后端控制器的问题

1. 关联查询缺少排序与数量限制

你当前的links关联查询只加了where('id', '<', $last_id),但没有指定排序和返回数量,这会导致每次请求返回所有符合id小于last_id的链接,而不是分页的几条,甚至可能因为数据库默认顺序问题重复返回内容。修改关联查询:

->with(['links' => function($query) use($last_id) {
    $query->where('id', '<', $last_id)
          ->orderBy('id', 'desc') // 按id倒序,确保每次取最新的旧数据
          ->take(8); // 每次加载8条,可根据需求调整数量
}])

2. 确认关联关系的正确性

检查Page模型中links关联的定义,确保外键和关联类型正确:

// Page.php
public function links()
{
    // 假设Link模型的外键是page_id,根据你的实际表结构调整
    return $this->hasMany(Link::class, 'page_id');
}

如果外键不匹配,关联查询会返回空或者错误的数据集,自然看起来每次返回的内容都一样。

3. 强制转换last_id的类型

确保$last_id是整数类型,避免字符串匹配导致的条件失效:

public function page_load_more($last_id, $pid) {
    $last_id = (int)$last_id; // 强制转为整数
    // 后续代码不变
}

然后修复前端jQuery的问题

1. 修正isLoading变量的作用域

你当前把isLoading定义在scroll事件内部,每次滚动都会重置为false,容易导致重复请求,进而出现重复内容。调整变量位置:

var isLoading = false; // 放在scroll事件外面
$(window).scroll(function () {
    // 先判断是否正在加载,避免重复请求
    if (!isLoading && $(document).height() <= $(window).scrollTop() + $(window).height()) {
        isLoading = true;
        var id = $('.link-shared:last-child').attr("rel");
        // 补全p_id的获取逻辑,比如从页面某个元素的属性读取
        var p_id = $(".page-container").data("pid"); 
        
        $.ajax({
            url: '/page-load-more/' + id + '/' + p_id,
            type: 'GET',
            success: function(data) {
                // 把返回的视图追加到容器中,而不是替换
                $('.links-list').append(data);
                isLoading = false;
                
                // 如果返回空内容,说明没有更多数据,解绑scroll事件
                if (!data.trim()) {
                    $(window).off('scroll');
                }
            },
            error: function() {
                isLoading = false; // 请求失败也要重置状态
            }
        });
    }
});

2. 验证last_id的正确性

在控制台打印id的值,确认每次滚动时获取的是最后一个链接的真实id:

var id = $('.link-shared:last-child').attr("rel");
console.log('当前last_id:', id); // 检查是否每次滚动都更新为最新的id

如果id始终是同一个值,说明前端获取元素的逻辑有问题,比如.link-shared:last-child选择器不正确,或者rel属性没有正确设置在每个链接元素上。

最后测试验证

直接在浏览器地址栏访问控制器路由,比如/page-load-more/100/your-page-pid(替换为真实的last_id和pid),查看返回的links是否符合id < 100的条件,这样可以快速区分是前端传递参数的问题,还是后端查询的问题。

内容的提问来源于stack exchange,提问作者Valter Sousa Cardoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:19:50