【问题标题】:Laravel Grouping by Eloquent RelationshipLaravel 按 Eloquent 关系分组
【发布时间】:2016-07-27 21:31:19
【问题描述】:

如何按关系分组?

例子

Sales::with('product_detail.product')->groupBy('product_name')->get()

如何用 eloquent 的代码得到结果?

【问题讨论】:

  • 这个问题解决了吗?

标签: laravel relation


【解决方案1】:

您可以指定一个回调函数来对您的关系进行分组,如下所示:

Sales::with(['product_detail.product' => function($query){
        $query->groupBy('product_name');
    }])->get();

【讨论】:

  • 由于关系是通过单独的查询而不是连接来提取的,因此这不能满足 OP 的要求。
【解决方案2】:

我认为最佳答案不是回答问题。据我了解,目的是对外部查询的结果进行分组,而不是对关系进行分组。

这在 Eloquent-y 数据库调用中是不可能的,因为对 With 的调用是分开的。您可以手动加入表格并按所需列分组。

如果你想保持 Eloquent-y,Collections 有很多方便的方法,包括 GroupBy。所以你可以先获取数据,然后再分组。

【讨论】:

  • 嘿 Sahil,您能否提供一行代码或示例对所提问题有用?
【解决方案3】:

laravel >= 7 你可以使用:

控制器

$user->sales()->groupBy('product_name')->get();

User.php 文件中:

public function sales(){
     return $this->hasMany('App\Sales','user_id');
}

【讨论】:

    【解决方案4】:

    这可能已经很老了,但它可以帮助寻求者。

    您可以在 Laravel 中使用 groupBy 直接链接到关系/远程关系。我不知道这是否特定于任何版本,但 V8 有效。并且关系也像您使用 with 一样被加载。

     Sales::query()->where('this', $that)->get()->groupBy('product.name'); // OR
    
     Sales::query()->where('this', $that)->get()->groupBy('product.status.name');
    

    【讨论】:

    • 你是对的,它确实帮助了一个寻求者:)
    • 值得注意的是,这是一种与问题中的方法完全不同的groupBy 方法。它正在处理一个集合,而不是数据库查询。
    【解决方案5】:

    按远亲分组:

    Sales::select(DB::raw('count(*) as count'), 'products.name')
      ->join('product_details', 'sales.product_detail_id', '=', 'product_details.id')
      ->join('products', 'product_details.product_id', '=', 'products.id')
      ->groupBy('products.name')
      ->get();
    

    【讨论】:

      【解决方案6】:

      这将帮助您按关系进行分组。

      $sales = Order::Sales('product')
              ->where('approved','=','Yes')
              ->groupBy('product_id')
              ->orderBy(DB::raw('COUNT(id)','desc'))
              ->get(array(DB::raw('COUNT(id) as totalsales'),'product_id'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2016-09-26
        相关资源
        最近更新 更多