Laravel - 将数组转换回集合

Cha*_*dle 6 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();
Run Code Online (Sandbox Code Playgroud)

也许我会犯这个错误,应该使用不同的查询生成器方法?

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

thi*_*vin 6

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

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

$categories = collect($categories);
Run Code Online (Sandbox Code Playgroud)


Dav*_*vit 2

你会Trying to get property of non-object因为其中之一而得到

DB::table('categories')->where('id', '=', $product->category_id)->first();
Run Code Online (Sandbox Code Playgroud)

返回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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

collect($categories); // is_array(categories) is true
Run Code Online (Sandbox Code Playgroud)

您在 foreach 中执行了许多请求。那不是正确的方法。相反,您可以实现仅执行 2 个请求的集合实例。

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

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

  • 代码转储,没有文字没有解释?有了 4K 代表,我想你会知道添加一些东西。 (2认同)