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
相关产品推荐
相关产品推荐

