firstOfMany 方法的作用与基本用法
firstofmany 是 thinkphp 6/8 中用于获取关联模型第一条记录的方法,常用于一对多或自关联场景。它默认按主键升序取第一条,若需获取最新一条,必须显式指定排序字段和方向。

$user = User::with(['latestPost' => function($query) {
$query->order('create_time', 'desc');
}])->find(1);
echo $user->latestPost->title;
上述代码通过 with 预加载并排序,确保 latestPost 属性为最新记录。若使用 firstOfMany 静态方法,写法如下:
$latestPost = Post::where('user_id', 1)->order('create_time', 'desc')->firstOfMany();
echo $latestPost->title;
注意:firstOfMany 本身不自动排序,必须配合 order 方法才能正确获取“最新”记录。否则返回的是数据库物理顺序的第一条,可能不是业务意义上的最新。
如何确保获取的是时间最新的记录?
要获取每用户最新一条帖子,核心是明确排序依据。通常使用 create_time 或 id(若自增且插入有序)。以下示例以 create_time 为例:

// 假设 User 模型有 hasMany 关联
public function posts() {
return $this->hasMany(Post::class, 'user_id');
}
// 获取所有用户的最新帖子
$users = User::all();
foreach ($users as $user) {
$latest = $user->posts()->order('create_time', 'desc')->firstOfMany();
echo "User {$user->name}: Latest post is '{$latest->title}'\n";
}
此段代码遍历每个用户,对其关联的帖子按 create_time 降序取第一条。若某用户无帖子,firstOfMany 返回 null,需做空值判断。
当存在相同创建时间的记录时如何处理?
若多个帖子具有完全相同的 create_time,order('create_time', 'desc') 无法保证唯一性,结果取决于数据库引擎的实现细节。为确保确定性,应增加二级排序,如按主键 id 降序:
$latest = $user->posts()->orderRaw('create_time DESC, id DESC')->firstOfMany();
或使用链式调用:
$latest = $user->posts()->order('create_time', 'desc')->order('id', 'desc')->firstOfMany();
这样即使时间相同,也会选取 ID 最大的那条,即最后插入的那条,符合“最新”的业务直觉。务必在排序条件中覆盖所有可能导致歧义的字段,避免结果不稳定。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











