【问题标题】:Laravel - Convert array back to a collectionLaravel - 将数组转换回集合
【发布时间】:2019-05-25 01:01:43
【问题描述】:

我试图仅在产品表中获取类别的集合。我的类别表有 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 行查询生成器来完成。

标签: php laravel


【解决方案1】:

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

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

$categories = collect($categories);

【讨论】:

    【解决方案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() helper 方法。 例如

    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

    【讨论】:

    • 代码转储,没有文字没有解释?有了 4K 代表,我想你会知道添加一些东西。
    • @AbraCadaver 编辑答案并附上解释。如果你愿意,你可以改进它。但这是有 2 个查询的解决方案
    • 这成功了。谢谢。但是我同意通过关系来做这件事会更好地使用代码
    【解决方案3】:

    这可以通过一个简单的有说服力的查询来完成。除非您做的事情过于复杂(在我看来),否则无需使用查询生成器。

    whereHas() 只会返回包含产品的类别。

    Categories::with('products')->whereHas('products')->get();

    只要模型上的关系正确,以上就是您要寻找的。正如 cmets 中所指出的,您需要模型和关系。 Laravel 使用 MVC 模式,第一个字母代表模型,所以我猜你正在使用它们。如果不让我知道,我可以帮助您进行设置,因为您应该使用它们。

    如果您需要使用查询生成器清理该代码并使用类似的东西,这样您就不必担心重新收集。另请查看hydrate() 方法,将这些通用类实例更改为Categories 模型的实例。

    DB::table('categories')->whereIn('id', function($q){
        $q->select('category_id')->from('products');
    })->get();
    

    【讨论】:

    • 这可能需要创建关系和模型,所以最好在你的回答中解释一下。
    猜你喜欢
    • 2016-05-12
    • 2019-08-10
    • 2018-08-01
    • 2018-08-11
    • 2017-06-30
    • 2019-01-05
    • 2019-07-05
    相关资源
    最近更新 更多