Laravel Eloquent中with与paginate同用列筛选时关联数据为空
解决方案
问题根源
- 关联字段筛选错误:你在
with中指定的home_team_id、away_team_id并非关联模型(假设是Team)的有效字段,应该替换为球队名称对应的字段(比如name);同时关联筛选必须包含关联模型的主键id,Laravel需要用它匹配主表的外键。 - 外键匹配逻辑缺失:如果主表查询未包含外键字段,Laravel无法建立主表与关联模型的关联关系,导致关联数据返回
null。
修正后的代码
首先确认Game模型的关联定义(确保外键设置正确):
// app/Models/Game.php public function homeTeam() { // 假设关联Team模型,外键为Game表的home_team字段,对应Team的id return $this->belongsTo(Team::class, 'home_team'); } public function awayTeam() { return $this->belongsTo(Team::class, 'away_team'); }
然后修改控制器中的查询逻辑:
$expiredMatchesPagination = Game::with([ 'homeTeam' => function ($query) { // 必须包含主键id,再加上需要的名称(假设字段为name)和logo $query->select('id', 'name', 'logo'); }, 'awayTeam' => function ($query) { $query->select('id', 'name', 'logo'); } ]) ->where('start', '<', Carbon::now()) ->orderBy('start', 'asc') ->paginate( perPage: 15, columns: ['start', 'home_team', 'away_team'], // 必须包含外键字段用于关联匹配 pageName: 'expiredMatchesPage' );
关键注意事项
- 关联模型的
select必须包含主键id:Laravel依赖主键与主表外键建立关联,缺少id会直接导致关联数据为null。 - 主表查询必须包含外键字段(
home_team、away_team):如果主表没选中这些字段,Laravel无法找到关联匹配的依据。 - 替换字段名适配你的表结构:如果球队表的名称字段不是
name,改成你实际使用的字段名即可。
内容的提问来源于stack exchange,提问作者donaldtheduckkk00
相关产品推荐
相关产品推荐

