Laravel Eloquent按关联模型字段排序报错及排序无效问题
问题描述
我想基于listing_packages.order字段对listing_data进行降序排序,初始查询语句如下:
ListingData::with(['listing_package'])->orderBy('listing_package.order','desc')->paginate(24);
执行后返回错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'listing_package.order' in 'order clause'
相关模型代码:
ListingData.php
public function listing_package(): BelongsTo { return $this->belongsTo(ListingPackage::class); }
ListingPackage.php
public function listing_data(): HasMany { return $this->hasMany(ListingData::class); }
我还尝试了以下写法,但数据并未按预期排序:
$relations = [ 'district', 'regency', 'province', 'category', 'type', 'rentType', 'listing_package' => function ($q){ $q->orderBy('order','DESC'); }, ]; $listings = ListingData::with($relations) ->latest() ->paginate(24);
请问我哪里遗漏了?
解决方案
错误原因
- 初始写法问题:直接用
orderBy('listing_package.order')无效,因为你没关联listing_packages表,Eloquent不会自动将关联模型名转换为数据库表名,SQL自然找不到对应字段。 - 第二种写法问题:在
with()里给listing_package加排序,只会对每个ListingData关联的套餐数据内部排序,完全不影响ListingData本身的排列顺序;再加上后面的latest()是按主表创建时间排序,直接覆盖了你要的规则。
正确写法
方法一:手动关联表后排序
通过join关联listing_packages表,指定排序字段:
ListingData::with(['listing_package', 'district', 'regency', 'province', 'category', 'type', 'rentType']) ->join('listing_packages', 'listing_data.listing_package_id', '=', 'listing_packages.id') ->orderBy('listing_packages.order', 'desc') ->select('listing_data.*') // 避免表字段冲突,仅获取主表数据 ->paginate(24);
注意:确认listing_data表的外键是listing_package_id(如果不是,替换为实际外键名称),select('listing_data.*')可防止主表与关联表有同名字段时出现数据混乱。
方法二:用Eloquent关联排序(Laravel 8+适用)
Laravel 8及以上版本支持直接通过关联关系指定排序字段,写法更简洁:
ListingData::with(['listing_package', 'district', 'regency', 'province', 'category', 'type', 'rentType']) ->orderByDesc('listing_package.order') ->paginate(24);
这种写法Laravel会自动处理表关联与字段拼接,无需手动写join。
注意事项
- 若使用Laravel 7或更早版本,只能采用方法一的
join写法。 - 确认
listing_packages表确实存在order字段,无拼写错误。
内容的提问来源于stack exchange,提问作者Raden Bagus
相关产品推荐
相关产品推荐

