Laravel分类下仅获取3篇博客问题:当前代码返回全量数据
每个分类仅取3条博客的实现方案
你当前的代码$categories = Category::has('blogs')->take(10)->get();里的take(10)是限制分类的数量,不是每个分类下的博客条数,所以会返回每个分类的所有关联博客。要实现每个分类只取3篇,需要在关联查询里做限制:
直接用with结合闭包就能搞定,修改后的代码:
$categories = Category::has('blogs') ->with(['blogs' => fn($query) => $query->take(3)]) ->take(10) ->get();
要是你的Laravel版本不支持短闭包(PHP 7.4+才支持),就写成完整的闭包形式:
$categories = Category::has('blogs') ->with(['blogs' => function ($query) { $query->take(3); }]) ->take(10) ->get();
关键逻辑说明
has('blogs'):过滤掉没有关联博客的分类,和你原有逻辑保持一致- 外层
take(10):控制最多获取10个分类(你的场景里只有2个,不影响最终结果) - 关联闭包里的
take(3):针对每个分类的博客关联做限制,确保每个分类仅返回3条博客
如果遇到旧版本Laravel中关联take不生效的问题(比如所有分类都返回相同的3条博客),可以改用子查询方式实现:
$categories = Category::has('blogs') ->with(['blogs' => function ($query) { $query->whereIn('id', function ($subQuery) { $subQuery->select('id') ->from('blogs') ->whereColumn('category_id', 'categories.id') ->take(3); }); }]) ->take(10) ->get();
内容的提问来源于stack exchange,提问作者Gagan Dev
相关产品推荐
相关产品推荐

