仅当产品表中有类别时,我才尝试获取它们。我的类别表有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确实得到了我想要的结果,但是在刀片中我得到了“试图获取非对象的属性”错误。
答案 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