Eloquent关联查询按关联字段排序报错,求正确实现方案
问题根源
你遇到的错误是因为client表本身没有supplier字段,orderBy('supplier')会让MySQL在client表中查找该字段,必然报错。而with('supplier')只是预加载关联的Supplier数据,不会把关联表的字段加入主查询的字段列表,也不会自动关联表用于排序。
两种可行解决方案
方案一:通过JOIN关联表实现排序
直接关联client和supplier表,指定排序字段来自supplier表:
$clients = Client::join('supplier', 'client.supplier_id', '=', 'supplier.id') ->select('client.*') // 仅选择client表的字段,避免字段冲突 ->orderBy('supplier.supplier', 'DESC') ->with('supplier') // 预加载关联,防止N+1查询问题 ->get();
方案二:使用子查询排序
如果不想用JOIN,可以通过子查询获取关联字段的值来排序:
$clients = Client::with('supplier') ->orderByDesc( Supplier::select('supplier') ->whereColumn('supplier.id', 'client.supplier_id') ->limit(1) ) ->get();
补充说明
- 方案一的
join方式性能较好,适合简单的关联排序场景,select('client.*')可以避免两张表字段名冲突的问题。 - 方案二的子查询方式更灵活,不需要显式关联表,适合关联关系复杂或需要动态条件的场景。
内容的提问来源于stack exchange,提问作者Mohammad Mansour
相关产品推荐
相关产品推荐

