Laravel如何修改hasOne关联获取Beam对应最新及上一条BeamData记录
方案1:用hasMany返回最新2条的集合
适合需要统一遍历处理最新2条数据的场景:
修改关联代码如下:
/** * 需要默认预加载的关联 * * @var array */ protected $with = ['beam_data']; /** * 获取关联的最新2条BeamData数据(新到旧排序) */ public function beam_data() { return $this->hasMany(BeamData::class, 'beam_id') ->orderBy('created_at', 'desc') ->take(2); }
使用说明:
- 返回结果为
Illuminate\Database\Eloquent\Collection类型,无关联数据时为空集合,不足2条时按实际数量返回 - 索引0对应最新数据,索引1对应第二新数据(如果存在)
- 要求Laravel版本≥8.42,可支持预加载时每个Beam模型独立返回2条关联数据
方案2:拆分两个独立hasOne关联
适合需要单独调用最新、次新数据的场景,兼容性更好:
修改关联代码如下:
/** * 需要默认预加载的关联 * * @var array */ protected $with = ['latest_beam_data', 'previous_beam_data']; /** * 获取最新的1条BeamData */ public function latest_beam_data() { return $this->hasOne(BeamData::class, 'beam_id') ->orderBy('created_at', 'desc'); } /** * 获取第二新的1条BeamData */ public function previous_beam_data() { return $this->hasOne(BeamData::class, 'beam_id') ->orderBy('created_at', 'desc') ->offset(1); }
使用说明:
- 无关联数据时两个属性均返回null,仅存在1条数据时
previous_beam_data返回null - 可独立调用任意关联,无需额外判断集合下标
- 兼容所有支持hasOne关联的Laravel版本,低版本预加载也不会出现数据错误
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

