Laravel-将数组转换回集合

时间:2019-05-24 15:50:39

标签: php 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确实得到了我想要的结果,但是在刀片中我得到了“试图获取非对象的属性”错误。

3 个答案:

答案 0 :(得分:3)

如果在刀片文件中使用$categories作为集合,则需要删除->all()方法。

->all()在创建集合后将其转换为数组:

$categories = collect($categories);

答案 1 :(得分:1)

这可以通过一个简单的口才查询来完成。除非您做的事情过于复杂(我认为),否则无需使用查询生成器。

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();

答案 2 :(得分:-1)

您之所以得到Trying to get property of non-object是因为

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

返回null值。
您可以通过这种方式解决

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

$categories = collect();
foreach($products as $product){
    $category = DB::table('categories')->where('id', '=', $product->category_id)->first();
    if ($category) {
        $categories->push($category); 
    }
}

如果要获取集合实例,则必须使用带有数组参数的collect()帮助方法。 例如

collect($categories); // is_array(categories) is true

您在foreach中有很多要求。那不是正确的方法。相反,您可以只执行2个请求即可实现集合实例。

 $categoryIds = DB::table('products')->pluck('category_id')->toArray();
 $categories = DB::table('categories')->whereIn('id', $categoryIds)->get();

请参阅文档https://laravel.com/docs/5.8/queries#retrieving-results