Laravel Eloquent关联查询转换求助:原生SQL转Eloquent并支持分页
解决方案:原生SQL转Laravel Eloquent并支持分页
没问题,我来帮你把这条原生SQL转换成可以直接用分页的Laravel Eloquent查询,完美适配你已经定义的customer关联。
首先先梳理下原生SQL的逻辑:我们需要查询订单表,关联用户表,筛选条件是订单ID等于搜索值、订单参考号包含搜索值,或者关联的用户名包含搜索值,最后还要支持分页。
你之前的代码里有个小错误:把orders.id = $search写成了针对reference_no的判断,我已经帮你修正过来了。完整的Eloquent代码如下:
$search = // 你的搜索值,Laravel会自动处理参数绑定,无需担心SQL注入 $orders = Order::where(function ($query) use ($search) { // 条件1:订单ID等于搜索值 $query->where('id', $search) // 条件2:订单参考号模糊匹配搜索值 ->orWhere('reference_no', 'LIKE', "%{$search}%") // 条件3:关联的用户表中用户名模糊匹配搜索值 ->orWhereHas('customer', function ($userQuery) use ($search) { $userQuery->where('name', 'LIKE', "%{$search}%"); }); })->paginate(15); // 这里的15是每页显示的条数,可根据需求调整
代码说明:
- 用
where()的闭包包裹所有OR条件:这是最佳实践,避免后续如果添加其他AND条件时,逻辑出现混乱(比如不小心把OR条件和其他条件混在一起)。 orWhereHas('customer', ...):利用你已经定义的customer关联方法,来查询关联的用户表数据,实现原生SQL中join users后的条件筛选。paginate():直接在查询构建器末尾调用这个方法,就能自动实现分页功能,返回的$orders对象可以直接在视图中使用分页链接,完全符合你的需求(不需要用DB::select)。
另外需要注意:如果你的搜索值可能是空字符串,建议在执行查询前先做判断,避免出现全表模糊查询的性能问题。
内容的提问来源于stack exchange,提问作者Cruze
相关产品推荐
相关产品推荐

