猿问

Laravel - 将数组转换回集合

只有当它们在产品表中时,我才试图获取类别的集合。我的类别表有 300 个项目。如果产品表中附加了一个类别,我只想要一个集合。$categories 集合应该只产生大约 10 个类别,因为只有大约 10 个产品具有不同的 category_ids


$products = DB::table('products')->groupBy('category_id')->get();


foreach($products as $product){

        $categories[] = DB::table('categories')->where('id', '=', $product->category_id)->first();

}


$categories = collect($categories)->all();

也许我正在解决这个错误,应该使用不同的查询构建器方法?


最终结果 $categories 确实得到了我想要的结果,但在我的刀片中,我得到了“试图获取非对象的属性”错误。


慕斯王
浏览 215回答 3
3回答

精慕HU

如果$categories在您的刀片文件中用作集合,则需要删除该->all()方法。->all() 在创建集合后将集合转换为数组:$categories = collect($categories);

慕少森

这可以通过一个简单的雄辩查询来完成。除非您正在做一些过于复杂的事情(在我看来),否则无需使用查询构建器。whereHas() 只会返回包含产品的类别。Categories::with('products')->whereHas('products')->get();只要模型上的关系正确,以上就是您要寻找的。正如评论中指出的那样,您需要模型和关系。Laravel 使用 MVC 模式,第一个字母代表模型,所以我猜你正在使用它们。如果不让我知道,我可以帮助设置它们,因为您应该使用它们。如果您需要使用查询构建器,请清理该代码并使用类似的东西,这样您就不必担心回忆了。另请查看hydrate()将这些通用类实例更改为Categories模型实例的方法。DB::table('categories')->whereIn('id', function($q){    $q->select('category_id')->from('products');})->get();
随时随地看视频慕课网APP
我要回答