Laravel - 将数组转换回集合

6
我希望只获取那些已经在产品表中的分类集合。我的分类表中有300个项目。只有当一个类别与产品表相关联时,我才想获取该集合。$categories集合应该只包括大约10个类别,因为只有约10个产品具有不同的category_id。
$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 能够得到我想要的结果,但在我的 Blade 模板中出现了“Trying to get property of non-object”错误。

请查看我的编辑。这可以使用3行查询构建器完成。 - N Mahurin
3个回答

6

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

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

$categories = collect($categories);

是的,就这么简单。我需要可计数的回来! - dustbuster

2
您会遇到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

最初的回答

2
代码转储,没有文字解释?我认为你应该知道要添加一些东西,有了4K声望。 - AbraCadaver
@AbraCadaver 编辑答案并解释。如果您愿意,可以改进它。但这是带有2个查询的解决方案。 - Davit Zeynalyan
这个方法很管用。谢谢。不过我同意,通过关系来实现会更好地利用代码。 - Chad Priddle

1
这可以通过一个简单的优雅查询完成。除非你要做一些过于复杂的事情(在我看来),否则不需要使用查询构建器。 whereHas() 只会返回具有产品的类别。
只要模型上的关系正确,上述代码就是您要寻找的内容。正如评论中指出的那样,您需要模型和关系。 Laravel 使用 MVC 模式,第一个字母代表模型,所以我猜你正在使用它们。如果没有,请告诉我,我可以帮助设置,因为你应该使用它们。
如果你需要使用查询构建器,请整理一下代码,像这样使用,这样你就不必担心重新收集了。还可以查看 hydrate() 方法,将这些通用类实例更改为 Categories 模型的实例。
DB::table('categories')->whereIn('id', function($q){
    $q->select('category_id')->from('products');
})->get();

这可能需要创建关系和模型,因此最好在您的答案中进行解释。 - thisiskelvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接