我试图仅获取产品表中的类别集合。我的类别表有 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 确实得到了我想要的结果,但在我的刀片中我收到“尝试获取非对象的属性”错误。
如果在刀片文件中用作$categories集合,则需要删除该->all()方法。
->all()在创建集合后将其转换为数组:
$categories = collect($categories);
Run Code Online (Sandbox Code Playgroud)
你会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
| 归档时间: |
|
| 查看次数: |
10091 次 |
| 最近记录: |