Laravel 7 如何从多对多关联的中间表获取指定对象的关联数据?
问题排查与解决步骤
核心原因(90%概率)
Laravel 多对多关联默认会按两个模型名的字母顺序拼接生成中间表名,Query和Question模型默认拼接的中间表名为question_query,但你实际使用的中间表名为query_question,关联定义时没有手动指定自定义中间表名,导致Laravel查询了不符合预期的中间表,返回空结果。
分步修复方案
1. 修正关联方法的中间表声明
分别修改两个模型的关联方法,手动传入第二个参数指定中间表名:
Query模型:
public function getQuestions(){ // 第二个参数显式指定自定义中间表名 return $this->belongsToMany(Question::class, 'query_question')->withPivot('sub_test_id', 'test_id', 'score', 'answer'); }
Question模型:
public function getQueries(){ // 第二个参数显式指定自定义中间表名 return $this->belongsToMany(Query::class, 'query_question')->withPivot('sub_test_id', 'test_id', 'score', 'answer'); }
2. 校验其他可能异常点
如果修正后还是为空,继续排查以下项:
- 确认你使用的
$query实例是已持久化到数据库的有效数据,打印$query->id和中间表query_question中存储的query_id对比,确认值匹配 - 若你的模型开启了软删除,关联查询会自动过滤被软删除的记录,需要在关联后追加
withTrashed()才能查询到软删除数据 - 可以打印关联生成的原生SQL校验逻辑是否正确:
// 输出生成的查询SQL,校验中间表名、查询条件是否符合预期 dd($query->getQuestions()->toSql(), $query->getQuestions()->getBindings());
3. 优化数据获取代码
无需循环遍历即可直接提取所有pivot字段:
$answers = $query->getQuestions->pluck('pivot');
内容的提问来源于stack exchange,提问作者Majestic99
相关产品推荐
相关产品推荐

