代码之家  ›  专栏  ›  技术社区  ›  Martin AJ

如何计算发票的总价?

  •  0
  • Martin AJ  · 技术社区  · 6 年前

    我有两张三张桌子:

    // invoices
    +----+----------------+
    | id |  invoice_code  |
    +----+----------------+
    | 1  | d09823r230r4   |
    | 2  | 34tf354f45tf   |
    +----+----------------+
    
    // commodities
    +----+-------------+------------+--------+
    | id | invoice_id  | product_id | number |
    +----+-------------+------------+--------+
    | 1  | 1           | 1          | 2      |
    | 2  | 1           | 3          | 4      |
    +----+-------------+------------+--------+
    -- number columns is the number of each ordered product in the invoice
    
    // products
    // invoices
    +----+-----------+---------+
    | id |   name    |  price  |
    +----+-----------+---------+
    | 1  | SFX-300   | 15000   |
    | 2  | GB32-b10  | 2000    |
    | 3  | SVX-m30   | 1200    |
    +----+-----------+---------+
    

    我只需要计算一张发票的总价。这是计算发票总价的公式 x :

    $total_invoice_price = 0;
    foreach( $invoice_x->commodities as $commodity){
    
        $total_invoice_price += ( $commodity.number * <products.price> )
    }
    
    echo $total_invoice_price;
    

    问题在于 <products.price> . 它需要再加入一个 products 桌子。你知道我怎样才能利用拉维关系做到这一点吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Philipp    6 年前

    如果您只需要总价格,可以在纯sql中使用聚合语句和三个表的连接来完成。

    SELECT invoice.invoice_code, SUM(product.price * commodities.number)
    FROM invoice
    JOIN commodities ON invoice.id = commodities.invoice_id
    JOIN product ON product.id = commodities.product_id
    GROUP BY invoice.id
    
        2
  •  2
  •   spicydog    6 年前

    要保存查询,应该使用要加入的模型“with()”进行紧急加载。

    我不知道你如何命名你的模型,也不知道它之间的联系有多好。

    让我们假设它是以传统的方式完成的。

    这是剧本。

    $total_invoice_price = $invoice_x->commodities
                                     ->with('products')
                                     ->get()
                                     ->map(function ($commodity) {
                                         return $commodity->number * $commodity->product->price;
                                     })
                                     ->sum();
    

    我所做的就是把产品和每种商品结合起来。我做get()是为了收集商品。从收藏品中,我们对每一件商品做了地图并把 number price 关于产品。然后我们乘以并返回每个商品记录的总和。在那之后,我们把所有的总数加起来,得到你的结果。

    我写的代码没有经过测试,所以试着根据你的代码调整它。

        3
  •  1
  •   Praveen Kumar Krupa Suthar    6 年前

    请检查以下查询

    $invoices_total = DB::table('invoices')
            ->join('products', 'invoices.id', '=', 'commodities.invoice_id')
            ->join('commodities', 'products.id', '=', 'commodities.product_id')
            ->sum('products.price * commodities.number')
            ->groupBy('invoices.id')
            ->get();