Laravel分页筛选报错:Closure无法转换为int的解决咨询
解决Laravel Ajax分页中"Object of class Closure could not be converted to int"错误
问题场景
实现房源筛选结果的分页功能时触发错误:Object of class Closure could not be converted to int。功能逻辑为选择标签后展示对应房源,通过Ajax、Laravel和jQuery实现,筛选功能正常,但点击分页按钮时报错。
前端分页调用代码
$(document).on('click', '.pagination a', function(event){ event.preventDefault(); var page = $(this).attr('href').split('page=')[1]; getMoreHouses(page); }); // 分页结果获取与渲染 function getMoreHouses(page) { var hseurl=$("#url").val(); var hsetag = $('input[class^="tagtitle"]').filter(":checked").val(); $.ajax({ type:"GET", url:'{{ route("rentalcategory.get-more-houses") }}' + "?page=" + page, data:{ url:hseurl, rentaltag:hsetag, }, success:function(data) { $('.showrentalhouses').html(data); } }) }
后端控制器原代码
public function get_more_houses(Request $request) { if($request->ajax()){ $hsedata=$request->all(); $rentalcaturl=$hsedata['url']; $rentalcatcount=Rental_category::where(['rentalcat_url'=>$rentalcaturl,'status'=>1])->count(); if($rentalcatcount>0){ $rentalcategorydetails=Rental_category::rentalcategorydetails($rentalcaturl); $housescategory=Rental_house::whereIn('rentalcat_id',$rentalcategorydetails['catids']) ->where(['rental_status'=>1,'is_extraimages'=>1,'is_rentable'=>1])->orderby('id','DESC')->paginate(4); $rentalcategories=Rental_category::withCount('rentalhses')->get(); $rentaltags=Rental_tags::with('tagshouse')->get(); $rentallocations=Location::where(['status'=>1])->get(); // 标签筛选逻辑 if(isset($hsedata['rentaltag']) && !empty($hsedata['rentaltag'])){ $hsetag_id = $hsedata['rentaltag']; $housescategory ->whereIn('id', function($q) use ($hsetag_id) { $q ->select('rental_id') ->from('rentalhouse_tags') ->where('tag_id', $hsetag_id); }); } return view('Front.Rentalslisting.rentalhsesjson',compact('rentalcaturl','rentallocations','rentalcatcount','rentalcategorydetails','rentaltags','housescategory','rentalcategories'))->render(); } } }
错误原因
你先调用paginate(4)生成了LengthAwarePaginator分页实例,之后试图在该实例上链式调用查询构造器的whereIn方法。分页实例不支持直接追加查询条件,导致闭包无法被正确解析,触发类型转换错误。
解决方法
调整查询顺序:先构建完整的查询条件,再执行分页操作。
修改后的后端控制器代码
public function get_more_houses(Request $request) { if($request->ajax()){ $hsedata=$request->all(); $rentalcaturl=$hsedata['url']; $rentalcatcount=Rental_category::where(['rentalcat_url'=>$rentalcaturl,'status'=>1])->count(); if($rentalcatcount>0){ $rentalcategorydetails=Rental_category::rentalcategorydetails($rentalcaturl); // 初始化查询构造器,暂不执行分页 $housescategoryQuery = Rental_house::whereIn('rentalcat_id',$rentalcategorydetails['catids']) ->where(['rental_status'=>1,'is_extraimages'=>1,'is_rentable'=>1]) ->orderBy('id','DESC'); // 追加标签筛选条件 if(isset($hsedata['rentaltag']) && !empty($hsedata['rentaltag'])){ $hsetag_id = $hsedata['rentaltag']; $housescategoryQuery->whereIn('id', function($q) use ($hsetag_id) { $q->select('rental_id') ->from('rentalhouse_tags') ->where('tag_id', $hsetag_id); }); } // 最后执行分页 $housescategory = $housescategoryQuery->paginate(4); $rentalcategories=Rental_category::withCount('rentalhses')->get(); $rentaltags=Rental_tags::with('tagshouse')->get(); $rentallocations=Location::where(['status'=>1])->get(); return view('Front.Rentalslisting.rentalhsesjson',compact('rentalcaturl','rentallocations','rentalcatcount','rentalcategorydetails','rentaltags','housescategory','rentalcategories'))->render(); } } }
说明
- 调整后,查询构造器会先整合所有筛选条件,再生成包含分页逻辑的SQL语句,避免了在分页实例上追加条件的错误。
- 前端代码无需修改,分页参数
page已正确传递,后端返回的视图会正常渲染分页链接。
内容的提问来源于stack exchange,提问作者stephen Weru
相关产品推荐
相关产品推荐

