Php 如何在Laravel获得最畅销的产品?

Php 如何在Laravel获得最畅销的产品?,php,sql,laravel,Php,Sql,Laravel,我的数据库结构: products -- name -- price -- qty orders -- user_id -- status ... etc order_product -- order_id -- product_id -- qty -- product_price_after_discount ( nullable ) 在以下情况下,我需要以产品的总销量获得大多数售出的产品: 订单状态==“已批准” 如果折扣后有产品价格忽略原始产品价格并计算 我错了闭嘴: $to

我的数据库结构:

products
-- name
-- price
-- qty

orders
-- user_id
-- status ... etc

order_product
-- order_id
-- product_id
-- qty
-- product_price_after_discount ( nullable )
在以下情况下,我需要以产品的总销量获得大多数售出的产品:

  • 订单
    状态==“已批准”
  • 如果折扣后有
    产品价格
    忽略原始产品价格并计算
我错了闭嘴:

  $topSellingProducts = Product::selectRaw('
                            products.id,
                            products.trade_name,
                            products.company_name
                        ')
                        ->leftJoin('order_product','order_product.product_id','=','products.id')
                        ->where('status','approved')
                        ->groupBy('products.id')
                        ->orderByDesc('total_sales')
                        ->get();

如果你想在计算最畅销产品时按顺序考虑数量:

DB::table('products')
    ->select([
        'products.id',
        'products.trade_name',
        'products.company_name',
        DB::raw('SUM(order_product.qty) as total_sales'),
        DB::raw('SUM(IFNULL(product_price_after_discount, products.price) * order_product.qty) AS total_price'),
    ])
    ->join('order_product', 'order_product.product_id', '=', 'products.id')
    ->join('orders', 'order_product.order_id', '=', 'orders.id')
    ->where('orders.status','approved')
    ->groupBy('products.id')
    ->orderByDesc('total_sales')
    ->get();

如果您想一次考虑每一个产品,然后将<代码>和(OrthoPur.QTY)替换为TooSoalSturt >代码>计数(*)为ToalSuthSuffy.P/>但如果您要获取“最畅销”产品,为什么价格会有所不同?我看不出你选择价格栏,“最畅销”的计算应该考虑<代码> QTy < /Cord>参数吗?例如,如果在一次订单中,订购了数量为100的产品。是100次还是一次?@hthell没有一次,但是100应该*以获得产品的价格\u总计\u售出\u价格错误:(where子句中的未知列'status')我认为是因为您在订单后检查产品表,并且状态列存在于订单而不是订单产品中table@lekw见最新答案,您应该加入

订单
表格以及最后一个问题,如果我使用模型而不是(DB::table),是否有任何影响?一般来说,您应该使用模型,但在这种情况下,您只选择一些属性,并且有一些原始查询,这可能并不重要。