Laravel中DB::table查询无法获取关联子对象的问题求助
解决Laravel中DB查询无法获取关联模型的问题
嘿,我明白你遇到的问题了——你用DB::table()查询出来的结果是标准对象(stdClass),不是Eloquent模型实例,自然没法调用你已经配置好的$post->tags关联关系啦。这也是为什么用Post::all()时能正常运行,因为它返回的是完整的Post模型集合。
下面给你两种解决方案,优先推荐第一种,毕竟更贴合Laravel的设计思路:
方案一:用Eloquent查询+预加载关联(推荐)
直接使用Post模型构建查询,就能利用已配置的关联关系,记得加上with('tags')预加载标签,避免循环中重复查询数据库的N+1性能问题:
$posts = Post::query() ->where('town_id', '=', $request->session()->get('citySelected')->id) ->orderBy('created_at', 'desc') ->with('tags') // 预加载所有关联的标签 ->paginate(10);
把这段代码替换掉原来的DB查询,视图里的@foreach($post->tags as $tag)就能正常工作了,而且性能更优。
方案二:如果一定要用DB门面查询(不推荐)
要是你因为特殊原因必须用DB::table(),就得手动处理标签关联,步骤如下:
- 先查询符合条件的文章:
$posts = DB::table('posts') ->where('town_id', '=', $request->session()->get('citySelected')->id) ->orderBy('created_at', 'desc') ->paginate(10);
- 提取这些文章的ID,批量查询对应标签并按文章ID分组:
// 获取所有文章ID $postIds = $posts->pluck('id'); // 查询关联的标签并按post_id分组 $tags = DB::table('tags') ->join('post_tag', 'tags.id', '=', 'post_tag.tag_id') ->whereIn('post_tag.post_id', $postIds) ->get() ->groupBy('post_id');
- 在视图里通过文章ID匹配对应的标签:
@foreach ($posts as $post) {{-- 用?? []处理无标签的文章,避免报错 --}} @foreach($tags[$post->id] ?? [] as $tag) <a class="btn btn-sm btn-info" href="/tag/{{ $tag->id }}"> <span>{{ $tag->name }}</span> </a> @endforeach @endforeach
总结
显然第一种方案更省心,代码简洁还能享受Eloquent的各种便利(比如模型事件、访问器等),除非有特殊需求,不然优先用Eloquent查询哦。
内容的提问来源于stack exchange,提问作者Poxxac
相关产品推荐
相关产品推荐

