Laravel Eloquent关联查询中按城市排序品牌门店列表问题
解决Laravel关联查询中门店按城市排序无效的问题
嘿,我来帮你搞定这个排序失效的问题!你遇到的核心问题是把orderBy放在了join的闭包内部,这只会影响关联表的连接条件,不会对最终的门店列表进行排序。而且其实完全不需要手动写join——既然已经定义了模型关联,用Eloquent的关联排序会更优雅且不易出错。
方案一:利用Eloquent关联直接排序(推荐)
因为Stores和Cities已经是belongsTo关联,你可以直接在with的闭包里针对关联表的字段排序,不需要手动join:
$brand = Brand::where('slug', '=', $slugurl) ->with(['stores' => function($q){ $q->where('status', 1) ->orderBy('cities.sort_number', 'DESC'); // 直接在这里指定排序字段 }]) ->firstOrFail();
如果你的Stores模型里的关联方法命名为city(比如public function city() { return $this->belongsTo(City::class); }),还可以用更清晰的关联名称写法:
$q->where('status', 1) ->orderBy('city.sort_number', 'DESC');
Laravel会自动帮你处理表的关联和别名,避免字段冲突。
方案二:如果一定要手动join,调整orderBy位置
如果你坚持要用join,需要把orderBy从join的闭包里移出来,同时要明确指定查询stores的所有字段,避免和cities的字段冲突:
$brand = Brand::where('slug', '=', $slugurl) ->with(['stores' => function($q){ $q->where('status', 1) ->join('cities', 'cities.id', '=', 'stores.city_id') ->orderBy('cities.sort_number', 'DESC') ->select('stores.*'); // 必须指定查询stores的字段,防止覆盖 }]) ->firstOrFail();
为什么原来的代码无效?
你之前把orderBy写在了join的闭包函数里,这个闭包是用来定义表连接的条件的,而不是用来设置整个查询的排序规则。所以这条排序语句根本没作用到最终的门店列表查询上,自然不会按城市排序显示。
内容的提问来源于stack exchange,提问作者Tom Kur
相关产品推荐
相关产品推荐

