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

Laravel项目中按hasMany关联首条记录日期对courses排序

Laravel 按关联首个session日期排序课程实现方案

前置准备

首先确认Course模型已经定义好sessions关联:

// app/Models/Course.php
public function sessions()
{
    return $this->hasMany(Session::class);
}

方案1:子查询排序(推荐,性能最优)

仅需一次SQL查询,不需要加载所有关联session数据,适合大数据量场景:

// 按最早session日期倒序排列课程,要升序就把orderByDesc改成orderBy
$courses = Course::orderByDesc(
    Session::select('start_date') // 此处替换为你session表中实际的日期字段名
        ->whereColumn('course_id', 'courses.id')
        ->orderBy('start_date', 'asc')
        ->limit(1)
)->get();

子查询会单独取出每个课程对应最早的一条session的日期,外层直接用该日期做排序,不会查询多余的session数据,性能远高于关联预加载后排序。


方案2:集合排序(适合小数据量场景)

如果课程总数不多,可以先预加载关联再用Laravel集合排序,代码更直观:

$courses = Course::with('sessions')
    ->get()
    ->sortBy(function ($course) {
        // 处理无session的课程兜底逻辑,没有的话默认排在最后/最前
        return $course->sessions->first()?->start_date ?? now();
    });

注意:该方案会查询所有课程的所有session数据,数据量超过千级时性能会明显下降,仅适合小数据集使用。


边界场景补充

如果需要过滤掉没有任何session的课程,新增has条件即可:

// 搭配方案1使用示例
$courses = Course::has('sessions')
    ->orderByDesc(
        Session::select('start_date')
            ->whereColumn('course_id', 'courses.id')
            ->orderBy('start_date', 'asc')
            ->limit(1)
    )->get();

内容的提问来源于stack exchange,提问作者Maher El Gamil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:06:00