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
相关产品推荐
相关产品推荐

