具有多个标题和行的Laravel销售报告表

brgchamk  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个表Seller、Products、Invoice和invoice_product。我想创建一个销售日报表,其中卖方名称作为行标题,产品作为列,如下所示
| | 卖方A|卖方B|卖方C|共计|
| - ------| - ------| - ------| - ------| - ------|
| * * 产品1**|第二章|1个|三个|六个|
| * * 产品2**| 1个|无|第二章|三个|
| * * 产品3**|五个|第二章|1个|八个|
我想要的是由每个卖家出售的产品数量,如果没有任何产品ID发票_产品中可用的任何卖家比应该由零。我无法拿出任何解决方案。

    • 卖方表**
  • 身份证
  • 卖方_名称
    • 发票表**
  • 身份证
  • 卖方标识
  • 总计
    • 产品表**
  • 身份证
  • 姓名
    • 发票_产品表**
  • 身份证
  • 发票标识
  • 产品标识
  • 数量
  • 数量

我试过了

$sales = Invoice::select(
        'seller_id',
        'invoice_product.product_id',
        DB::raw('SUM(invoice_product.qty) as qty')
    )
    ->groupBy('invoice_product.product_id', 'seller_id')
    ->join('invoice_product', 'invoice.id', '=', 'invoice_product.invoice_id')
    ->whereIn('seller_id', [1, 2])
    ->whereIn('invoice_product.product_id', [1, 2, 3])
    ->get();

有人知道如何获得想要的结果吗?

xmd2e60i

xmd2e60i1#

我有一个解决方案给你,利用卖方模型,而不是发票和使用软件包staudenmeir/雄辩有很多深.

// 1st query produce 2 sellers
$sellers = Seller::whereIn('id', [1, 2])->get()->keyBy('id'); 

// 2nd query product 3 products
$products = Product::whereIn('id', [1, 2, 3])->get()->keyBy('id'); 

        foreach ($sellers as $seller_id => $seller) {
            // run multiple queries depend on how many sellers do you have
            $data = Seller::query()
                ->find($seller_id)
                ->products()
                ->groupBy('product_id')
                ->selectRaw('COALESCE(SUM(qty), 0) AS qty, product_id')
                ->pluck('qty', 'product_id');

            foreach ($products as $id => $product) 
            {
                var_dump('seller ' . $seller_id . ' | product ' . $product->id . ' | qty ' . (isset($data[$id]) ? $data[$id] : 0));
            }

            // counting total of products sold by each sellers
            var_dump('total ' . array_sum($data->toArray()));
        }

这是卖方模型内部的关系

public function products()
{
return $this->hasManyDeep(
                Product::class,
                [Invoice::class, 'invoice_products']
            )
            ->withPivot(
                'invoice_products', 
                ['qty', 'amount']
            )
            ->groupBy('products.id');
}

这个解决方案确实需要运行多个查询,这取决于你有多少卖家。

相关问题