You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9 关联查询:获取教育游戏中关联的多语言问题集合

教育类游戏多语言问题查询解决方案

我正在开发一款教育类游戏,核心需求是问题支持多语言——一款游戏包含多个问题,每个问题对应多种语言。现有模型:Game、GameQuestion、QuestionGroup、Question、Language,已定义的模型关联如下:

现有模型关联代码

Game模型

public function game_questions()
{
    return $this->hasMany(GameQuestion::class);
}

GameQuestion模型

public function question_groups()
{
   return $this->belongsToMany(QuestionGroup::class, 'questions','question_group_id');
}

QuestionGroup模型

public function questions()
{
   return $this->hasMany(Question::class);
}

Question模型

public function language()
{
  return $this->belongsTo(Language::class);
}

Language模型

public function questions()
{
   return $this->hasMany(Question::class);
}

我需要查询获取指定用户的游戏所关联的多语言问题集合,尝试了以下代码但未成功:

$games = Game::where('user_id', $user_id)->orderBy('created_at', 'DESC')->with('game_question_question_group')->get();

解决方案

1. 修正关联定义问题

首先检查GameQuestion模型的question_groups关联:原代码中指定的中间表是questions,这是存储问题的表,并非GameQuestion与QuestionGroup的关联中间表,需要修正为正确的中间表及外键:

// GameQuestion模型修正后的关联
public function question_groups()
{
    // 假设中间表名为game_question_question_group,包含game_question_id和question_group_id两个字段
    return $this->belongsToMany(QuestionGroup::class, 'game_question_question_group', 'game_question_id', 'question_group_id');
}

注意:请根据实际数据库中的中间表名称和字段名调整参数。

2. 使用嵌套预加载查询完整数据

Laravel中需要通过嵌套预加载逐层加载关联模型,才能获取到游戏关联的所有多语言问题。替换原查询代码为:

$games = Game::where('user_id', $user_id)
    ->orderBy('created_at', 'DESC')
    ->with([
        'game_questions.question_groups.questions.language'
    ])
    ->get();

代码说明

  • game_questions:加载当前游戏关联的所有GameQuestion记录
  • question_groups:加载每个GameQuestion关联的QuestionGroup集合
  • questions:加载每个QuestionGroup下的所有Question记录
  • language:加载每个Question对应的语言信息

查询完成后,即可通过$games获取指定用户的所有游戏,以及每个游戏关联的完整多语言问题集合。


内容的提问来源于stack exchange,提问作者Benbaodan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:35:33