如何使用Laravel Eloquent获取分类下的2个子分类?为何仅单个分类返回2个?
如何用Laravel Eloquent获取分类下的2个子分类
单个分类获取2个子分类
如果针对单个分类,直接在关联关系上调用take()方法即可:
// 获取目标分类 $category = Category::find($categoryId); // 获取该分类下的2个子分类 $subcategories = $category->children()->take(2)->get();
也可以链式调用一步完成:
$subcategories = Category::find($categoryId)->children()->take(2)->get();
批量获取多个分类(每个分类带2个子分类)
如果要一次性获取多个分类,且每个分类仅加载2个子分类,需要用with()结合闭包来单独限制每个父分类的关联数量:
$categories = Category::with(['children' => function ($query) { $query->take(2); }])->get();
为什么仅单个分类返回2个子分类?
这种问题通常出现在批量加载关联时,take(2)被全局应用到了整个关联查询,而非每个父分类单独限制。
常见错误示例
如果写成下面这样,会导致所有分类的子分类总数仅返回2条,而非每个分类各2条:
// 错误写法:全局限制子分类总数为2 $categories = Category::with('children')->take(2)->get();
另外,若你在模型的关联方法中直接定义了take(2),批量加载时Laravel会合并所有子分类的查询,最终只有第一个父分类能拿到2条数据,其他分类的子分类会被过滤。
正确解决方式
必须在with()的闭包内单独设置关联数量限制,Laravel会为每个父分类单独执行子分类查询,确保每个分类都能返回2个子分类:
$categories = Category::with(['children' => function ($query) { $query->take(2); }])->get();
内容的提问来源于stack exchange,提问作者Safayet Hossain
相关产品推荐
相关产品推荐

