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
相关产品推荐
相关产品推荐

