Laravel关联查询无法获取tags表数据问题排查
问题原因及解决方案
你遇到的问题其实很直观——你的查询虽然成功关联了tags表,但完全没有选择任何tags表中的字段,所以返回结果里自然不会包含tags的数据。
看一下你原查询里的select语句:
select(DB::raw('count(tag_id) as repetition, tag_id'))
即便通过join把tags表关联了进来,如果不把需要的tags字段明确加入到select中,数据库是不会自动返回这些字段的。
修改方案
只需要在select里添加你需要的tags表字段即可,同时注意groupBy的规则(MySQL严格模式下,非聚合字段必须出现在groupBy中)。
示例1:指定特定tags字段
如果只需要tags表中的部分字段,可以逐个列出来:
DB::table('tags_ref') ->join('tags', 'tags_ref.tag_id', '=', 'tags.id') ->select( DB::raw('count(tags_ref.tag_id) as repetition'), 'tags_ref.tag_id', 'tags.id as tag_table_id', // 重命名避免和tags_ref的tag_id混淆 'tags.name', 'tags.slug' // 假设tags表有这个字段 ) ->groupBy('tags_ref.tag_id', 'tags.id', 'tags.name', 'tags.slug') ->orderBy('repetition', 'desc') ->get();
示例2:获取tags表所有字段
如果需要tags表的全部字段,可以用tags.*简化写法:
DB::table('tags_ref') ->join('tags', 'tags_ref.tag_id', '=', 'tags.id') ->selectRaw('count(tags_ref.tag_id) as repetition, tags_ref.tag_id, tags.*') ->groupBy('tags_ref.tag_id', 'tags.id') // 只要groupBy tags的主键,其他字段在严格模式下会被允许(依赖数据库配置) ->orderBy('repetition', 'desc') ->get();
小提醒
如果你的MySQL没有开启严格模式,可能不加所有非聚合字段到groupBy也能运行,但这属于不规范写法,容易引发后续兼容性问题,建议严格遵循groupBy的规则,把所有非聚合的选择字段都加入到groupBy中。
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

