0

0

在 Laravel 中根据关联模型的第一个(最旧)记录日期进行排序

花韻仙語

花韻仙語

发布时间:2025-11-08 12:03:02

|

539人浏览过

|

来源于php中文网

原创

在 Laravel 中根据关联模型的第一个(最旧)记录日期进行排序

本教程将指导您如何在 laravel 项目中,根据 `hasmany` 关系中关联子模型的第一个(最旧)记录的日期,对父模型进行高效排序。我们将利用 laravel 提供的 `hasone` 关系结合 `oldestofmany()` 方法,简化复杂的查询逻辑,实现精确且性能优异的排序功能。

在 Laravel 应用开发中,一个常见的需求是根据关联模型的数据来对主模型进行排序。例如,我们有一个 Course 模型,它通过 hasMany 关系关联了多个 Session 模型。现在,我们需要根据每个课程的“第一个”会话(即日期最旧的会话)的日期来对课程进行排序。直接使用 orderBy 结合 hasMany 关系通常无法满足这种“获取并排序第一个关联记录”的复杂逻辑。

核心概念:hasOne 与 oldestOfMany()

Laravel 提供了 oldestOfMany() 方法,这是一个强大的工具,专门用于从 hasMany 关系中获取单个“最旧”或“最新”记录。当与 hasOne 关系结合使用时,它允许我们定义一个“一对一”的关系,但这个“一”是从“一对多”关系中筛选出来的特定记录。

要实现按第一个会话日期排序课程,我们首先需要在 Course 模型中定义一个特殊的 hasOne 关系,该关系将返回该课程下日期最旧的一个会话。

假设我们的 Session 模型有一个 created_at 字段用于表示会话创建日期。

// app/Models/Course.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Course extends Model
{
    /**
     * 获取课程最早的一个会话。
     * 使用 oldestOfMany() 方法来确保我们只获取日期最旧的那个会话。
     * 默认情况下,oldestOfMany() 会根据主键进行排序。
     * 如果要根据 created_at 排序,需要明确指定。
     */
    public function oldestSession(): HasOne
    {
        // 明确指定根据 'created_at' 字段来确定“最旧”的会话
        return $this->hasOne(Session::class)->oldestOfMany('created_at');
    }

    /**
     * 如果您需要获取所有会话,可以定义一个标准的 hasMany 关系
     */
    public function sessions()
    {
        return $this->hasMany(Session::class);
    }
}

在 oldestOfMany() 方法中,我们传入了 'created_at' 作为参数,这指示 Laravel 应该根据 sessions 表的 created_at 字段来确定哪个会话是“最旧的”。如果没有指定参数,它将默认使用主键进行排序。

68爱写
68爱写

专业高质量AI4.0论文写作平台,免费生成大纲,支持无线改稿

下载

实现排序逻辑

定义了 oldestSession 关系后,我们就可以在查询 Course 模型时利用这个关系进行排序。为了实现父模型(Course)的排序,我们需要通过 JOIN 操作将每个课程的最早会话日期引入主查询中。

以下是实现这一排序逻辑的推荐方法:

// 例如,在控制器或服务中

use App\Models\Course;
use App\Models\Session;
use Illuminate\Support\Facades\DB;

class CourseController extends Controller
{
    public function index()
    {
        // 1. 构建一个子查询,用于获取每个 course_id 对应的最早会话日期
        $firstSessionsSubquery = Session::select('course_id', DB::raw('MIN(created_at) as first_session_date'))
            ->groupBy('course_id');

        // 2. 将主查询 (Course) 与上述子查询进行左连接 (leftJoinSub)
        //    这样每个课程就能关联到它的最早会话日期
        $courses = Course::select('courses.*') // 明确选择 courses 表的所有列,避免列名冲突
            ->leftJoinSub(
                $firstSessionsSubquery,
                'first_sessions', // 子查询的别名
                'first_sessions.course_id', '=', 'courses.id'
            )
            ->orderBy('first_sessions.first_session_date', 'asc') // 根据最早会话日期进行升序排序
            ->with('oldestSession') // 如果需要同时加载每个课程的最早会话的完整对象,则进行预加载
            ->get();

        return view('courses.index', compact('courses'));
    }
}

代码解释:

  • $firstSessionsSubquery: 这个子查询会遍历 sessions 表,为每个 course_id 找到最小的 created_at 值,并将其命名为 first_session_date。
  • leftJoinSub(): 我们使用 leftJoinSub 将 Course 模型与这个子查询的结果连接起来。`

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

314

2023.10.17

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号