You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:08:27