【问题标题】:Laravel calculate Total balance by ratesLaravel 按费率计算总余额
【发布时间】:2020-11-15 15:47:53
【问题描述】:

我有一个有 4 张桌子的电子商务网站

(Users, Vendors, Products and Orders). 

这里的供应商是指商店。

用户是一个人,可以拥有许多不同的供应商。

这些供应商可以有许多不同的产品(供应商有很多产品关系和产品属于供应商关系)。

orders 表保存客户购买时的所有交易信息。

现在我们通过电子商务网站上发生的每笔销售的佣金来赚钱。

每个产品的佣金是根据其所在的供应商(商店)的百分比计算的。这些费率存储在 Vendors 表中。

在我的产品表中

id
product_name
product_price
product_image
product_file
product_description
product_level
vendor_id

在我的供应商表中,我有:

id
user_name
vendor_email
vendor_name
rate

在我的订单表中,我有:

id
customer_name
customer_tel
product_name
product_price
product_id
vendor_email
transaction_id
payment_status

需要注意的关键事项:供应商电子邮件是独一无二的。 products 表中的 vendor_id 是 vendor 表中的 id 字段等。

现在,让我们假设用户 John 拥有 3 个供应商(A、B 和 C)以及这些供应商下的 5 个产品。

对于供应商 A,我们为供应商 B(B1、B2 ..)和供应商 C(C1、C2 等)提供相同的产品 A1、A2、A3 等。

假设约翰对商店 A 的佣金率为 5%,对商店 B 的佣金率为 10%,对商店 C 的佣金率为 0%。

Vendor A: rate = 5%.
Products = [A1, A2, A3, A4, A5]

Vendor B: rate = 10%.
Products = [B1, B2, B3, B4, B5]

Vendor C: rate = 0%.
Products = [C1, C2, C3, C4, C5]

这意味着,如果产品 A1(在商店 A 中找到)售价 10 美元并且被购买,我们将获得销售额的 5%:

5/100 * $10 = $0.5

约翰得到了 95%,这是

$10 - $0.5 = 9.5$.

让我们购买另一种产品 B2(可在商店 B 中找到,税率为 10%),价格为 100 美元。这意味着我们得到每笔销售的 %10,而约翰得到 90%。

即:10/100 * $100 = $10 代表我们,John 得到 $100 - $10 = $90

让我们以最终产品 c1(在商店 C 中以 0% 的价格找到)价格为 200 美元。这意味着当这个产品被购买时,约翰得到了所有的钱。

现在对于这三种产品,如果约翰要计算他的总收入,这将是:

$9.5 + $90 + $200 = $299.5

我们的总佣金将是:

$0.5 + $10 + $0 = $10.5

我希望能够向用户显示这些数据。太胖了,我可以在控制器中使用 eloquent 获取集合并将数据显示给用户。

在我的控制器中,我有:

public function index()
    {
        $myOrders = ['vendor_email' => Auth()->User()->email, 'payment_status' => 'SUCCESSFUL'];
        $orders = Order::where($myOrders)->orderBy('created_at', 'desc')->paginate(10);
        $products = Product::with('vendor')->get();
        $totalOrders = Order::where($myOrders)->count();     

        return view('admin.orders', compact('orders', 'products', 'totalOrders'));                
    }

在我看来,为了获得 John 为每种产品赚取的金额,我在刀片中使用了 Foreach 循环:

Total: {{totalOrders}}
    @foreach($orders as $order)
       @if(Auth()->User()->email == $order->vendor_email)
         Product Name: {{$order->product_name}}
         Product Price: {{$order->product_price}}                                                                                     
         @foreach($products as $product)
            @if($order->product_id == $product->id)
               Rate: {{$product->vendor->rate}}
               Income: {{$order->product_price  * $product->vendor->rate}}
               Vendor: {{$product->vendor->vendor_name}}
            @endif
          @endforeach
        @endif                  
    @endforeach

这非常有效,因为它会为已购买的每种产品返回正确的数字。如果我们以上面的例子为例,它将返回

 Total: 3 
    Product |  Price |Rate |Income |Vendor
      A1    |   $10  |5%   |$9.5   |A
      B2    |   $100 |10%  |$90    |B
      C1    |   $200 |0%   |$200   |C

我最大的问题是如何从控制器动态获取总收入,并将其作为变量显示在 Blade View 中。我希望能够在控制器中获得这个值,这样我就可以对其进行计算,比如用户想要提取他的部分收入,我应该能够从总收入中扣除提取金额并显示剩余的金额等。 我一直被这个问题困扰,我已经做了很多谷歌搜索,但似乎找不到任何解决方案。我通过以下方式获得了每个用户的产品总数:

$totalOrders = Order::where('vendor_email', Auth()->User()->email)->where('payment_status', 'SUCCESSFUL')->count();

我可以通过简单地在刀片中调用这个变量来显示每个用户的总订单数:

Total: {{$totalOrders}}

我现在的问题是如何计算用户的总收入:即用每件产品的售价乘以供应商商店的佣金率,这样我就可以得到一些变量,例如:

Total Income: {{some Variable}}

我真的需要这方面的帮助。

【问题讨论】:

  • 为什么您的order 表中有product_nameproduct_price 和其他产品详细信息?您应该只在 order 表中有 product_id,然后您可以从 product 表中获取详细信息。
  • @Aashishgaba 感谢您在下面的回答。我对您在下面提供的代码做了一些修改,它就像魔术一样工作。谢谢。

标签: mysql laravel eloquent laravel-blade eloquent-relationship


【解决方案1】:

订单模式

public function product(){
   return $this->belongsTo(App\Product::class, 'product_id', 'id');
}

产品型号

public function orders(){
   return $this->hasMany(App\Order::class, 'order_id', 'id');
}

public function vendor(){
   return $this->belongsTo(App\Vendor::class, 'vendor_id', 'id');
}

控制器

// These are orders for the logged in user.

$orders = Order::with('product.vendor')->where([
   'vendor_email' => Auth()->User()->email, 'payment_status' => 'SUCCESSFUL'])
    ->get();

// Their income should be (100 - rate)% since the rate is the commission you get // as you stated in your post.

$totalIncome = $orders->sum(function ($order) {
    return ($order->product->product_price * (100 - $order->product->vendor->rate);
});

$totalOrders = sizeof($orders);

return view('admin.orders', compact('orders', 'totalIncome', 'totalOrders'));                

刀片

Total Orders: {{totalOrders}}

@foreach($orders as $order)
      Product Name: {{$order->product->name}}
      Product Price: {{$order->product->product_price}}                                                                                     
      Rate: {{$order->product->vendor->rate}}
      Income: {{$order->product->product_price  * (100 - $order->product->vendor->rate)}}
      Vendor: {{$order->product->vendor->vendor_name}}
@endforeach

Total Income: {{totalIncome}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多