Laravel 5.3关联模型price的list_price字段排序问题求助
解决Laravel 5.3中按关联模型字段排序的问题
你遇到的这个问题很常见——直接用->orderBy('price.list_price','desc')不生效,核心原因是with()属于预加载关联机制:Laravel会先执行主查询拿到所有Product数据,再单独发起查询去获取关联的price、child等模型,这两个查询是完全独立的,主查询里根本不存在price.list_price这个字段,自然排序逻辑不会生效。
下面给你两种可行的解决方案,你可以根据自己的关联关系来选:
方案一:用左连接(Left Join)关联价格表
这种方法适合一对一关联或者需要明确关联条件的场景,把price表直接并入主查询,这样就能直接用它的字段排序:
假设你的Product和Price是一对一关联(比如Price表通过product_id外键关联products.id),代码可以这么写:
$products = Product::select('products.*') // 避免多表字段冲突,只取Product表的字段 ->with(['child','price','variant','thumbnail','image', 'description']) ->leftJoin('prices', 'products.id', '=', 'prices.product_id') ->orderBy('prices.list_price', 'desc') ->take($recperpage) ->get();
如果你的关联是反向的(比如Product通过price_id字段关联Price),只需要修改join的条件:
->leftJoin('prices', 'products.price_id', '=', 'prices.id')
方案二:用子查询实现排序
如果不想用join,也可以通过子查询直接获取每个Product对应的list_price来排序,同样适合一对一关联场景:
$products = Product::with(['child','price','variant','thumbnail','image', 'description']) ->orderByRaw('(SELECT list_price FROM prices WHERE prices.product_id = products.id) DESC') ->take($recperpage) ->get();
特殊场景:一对多关联
如果一个Product对应多个Price,你需要先明确排序逻辑(比如按最高价格/最低价格),举个按最高价格排序的例子:
$products = Product::with(['child','price','variant','thumbnail','image', 'description']) ->orderByRaw('(SELECT MAX(list_price) FROM prices WHERE prices.product_id = products.id) DESC') ->take($recperpage) ->get();
最后提醒下:不管用哪种方法,都要确保你的关联外键和模型中定义的price()关联方法一致,不然会出现关联错误哦。
内容的提问来源于stack exchange,提问作者Eugene Anthony
相关产品推荐
相关产品推荐

