Laravel Eloquent 如何从指定城镇关联场所中提取存在的分类数组
提取指定城镇下所有场所分类数组的实现方案
方案一:基于已有的查询结果提取(适合已经需要用到$town下场所关联数据的场景)
你已经预加载了所有场所及其分类,直接用Laravel集合的操作方法就能快速提取,无需额外查询数据库:
// 提取完整分类对象数组,自动去重 $categoryArray = $town->places ->pluck('categories') // 取出所有场所的分类集合 ->flatten() // 将多层集合拍平为一维分类集合 ->unique('id') // 按分类ID去重,避免不同场所的重复分类 ->values() // 重置数组键为连续索引 ->toArray(); // 如果只需要分类名称组成的一维数组,追加pluck即可 $categoryNames = $town->places ->pluck('categories') ->flatten() ->unique('id') ->pluck('name') ->toArray();
方案二:独立查询分类(不需要查询场所数据时更高效,内存占用更低)
如果你不需要用到城镇下的场所详情,只是单独要分类数组,可以直接通过关联关系查询,不需要加载所有场所数据:
// 先拿到目标城镇的ID $townModel = Town::where('identifier', $town)->first(); // 直接查询关联该城镇场所的所有分类 $categoryArray = PlaceCategory::whereHas('places', function ($query) use ($townModel) { $query->where('town_id', $townModel->id); })->get()->toArray();
两种方案按需选择即可,如果你本来就要渲染场所列表,用方案一不需要额外请求数据库;如果只需要分类列表,方案二的查询性能更高。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

