通过 laravel 和 sql 分组的问题

Posted

技术标签:

【中文标题】通过 laravel 和 sql 分组的问题【英文标题】:Issue with group by laravel and sql 【发布时间】:2019-05-16 15:56:58 【问题描述】:

首先,我遇到了计算每天销售的产品的问题。在sql中我有查询

select product_name, sum(quantity) as quantity from invoice_product 
join invoices on invoices.id = invoice_product.invoice_id
join products on products.id = invoice_product.product_id
 where invoices.issued_at = '2019-05-16' 
 and products.`made_by_us` = 1
 group by product_name

它向我展示了有趣的信息,但我使用 product_name 来制作 group by 但我应该使用 product_id - 我也需要显示名称,但我不知道该怎么做。

其次,我想在 Laravel 中使用它,所以也许有人知道在 Eloquent 中可以使用它吗?

提前谢谢你:)

【问题讨论】:

【参考方案1】:

我会选择withCount()select(DB::raw()),像这样:

$products = Product::withCount(['invoices as quantity' => function ($query) 
    $query->select(DB::raw('sum(quantity)'));
])->get();

然后,您可以像这样访问每个数量总和:

$quantity = $products->first()->quantity;

【讨论】:

【参考方案2】:

您需要更新模型关系才能实现这一目标。

型号:

InvoiceProduct模特

class InvoiceProduct extends Model

    protected $table = 'invoice_product';

    protected $guarded = [
        'id',
    ];


public function invoice()

    return $this->belongsTo('App\Invoice'); // Assuming `Invoice` Model is directly in app folder


public function product()

    return $this->belongsTo('App\Product'); // Assuming `Product` Model is directly in app folder

控制器:

$full_query = InvoiceProduct::whereHas('invoice', function ($query) 
   return $query->where('issued_at', '2019-05-16');
)->whereHas('product', function ($query) 
   return $query->where('made_by_us', 1);
);

$product_names = $full_query->get(['product_name']);
$total_quantities = $full_query->sum('quantity');

【讨论】:

谢谢你,它工作得很好,但我需要一种不同的方式,我需要product_namequantity 这个产品不是所有产品,如果你有我尝试自己做有时间请给我指路。最好的解决方案可能是$product_names = $full_query->get(['product_name'], sum['quantity']);,但它不起作用。 我认为您需要按产品 ID 分组 试试$product_names = $full_query->select('product_name', \DB::raw('SUM(quantity) as quantity'))->get()

以上是关于通过 laravel 和 sql 分组的问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Laravel:如何通过选择两列进行分组具有不同的值

通过给定的经度和纬度查找在数据库中注册的位置 - Laravel

Laravel 选择列,然后按日期对列值进行分组

如何通过Composer安装Laravel