如何在Laravel的OfMany关联中处理Sort字段Null值排序?
解决方案
方式一:通过聚合函数处理NULL值
把NULL值转换为一个极大值,让min聚合时自动忽略它(实际是视为最大的数,不会被选中为最小值),同时保留你的排序规则:
use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\DB; public function mediaGalleryLatest(): MorphOne { return $this->media() ->one() ->ofMany( [ // 用IFNULL把NULL转成极大值,再取min 'sort' => DB::raw('MIN(IFNULL(sort, 999999))'), ], fn (Builder $query) => $query ->whereCollection('gallery') ->orderByRaw('ISNULL(sort), sort ASC') ); }
方式二:先排序再取第一条
直接在ofMany的查询闭包中加入你的排序规则,然后指定取任意唯一字段的min(这里用id),因为排序后第一条就是你要的条目:
use Illuminate\Database\Eloquent\Builder; public function mediaGalleryLatest(): MorphOne { return $this->media() ->one() ->ofMany( ['id' => 'min'], fn (Builder $query) => $query ->whereCollection('gallery') ->orderByRaw('ISNULL(sort), sort ASC') ); }
说明
- 方式一:通过
IFNULL将NULL替换成足够大的数值,确保MIN()计算时只会选中非NULL的最小sort值,同时orderByRaw保证排序时NULL排在最后。 - 方式二:
ofMany在执行时会先按照闭包中的排序规则对结果集排序,然后取指定字段的最小值,排序后第一条就是符合要求的条目,取id的最小值就能拿到它。
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

