Laravel:为当前用户购买最多的产品

时间:2019-09-02 09:56:49

标签: mysql laravel eloquent

我这里有3个表(order_lists,order_details,产品)

表order_lists包含以下user_id

表order_details包含以下order_lists_id product_id

表产品包含所有产品详细信息。

这三个表在模型中相互关联。

我需要根据此order_details从表user_id中选择购买最多的商品。

我做了一个非常基本的口才查询,该查询将为该用户选择6种产品,但坚持如何获得最多购买的产品

$mostPurchases = OrderList::where( 'user_id', Auth::id() )
                 ->with( [
                   'orderDetails' => function ( $query ) {
                         $query->with( 'productId' );
                    }
                 ] )->take( 6 )->get();

order_details中,我需要计算用户购买最多的产品。

  

更新

@ party-ring建议使用DB :: raw查询,这就是最终查询的样子。

$usId          = Auth::id();
        $mostPurchases = DB::select( DB::raw( 'SELECT product_id, count(*) from order_details
            LEFT JOIN order_lists ON order_details.order_lists_id = order_lists.id
            WHERE order_lists.user_id = ' . $usId . '
            group by product_id
            order by count(*) DESC
            LIMIT 6' ) );
  

更新

DB::table( 'products' )
              ->where( 'soft_delete', '!=', 1 )
              ->leftJoin( 'order_details', 'products.id', '=', 'order_details.product_id' )
              ->select( DB::raw( 'count(*) as pro_count, product_id' ) )
              ->leftJoin( 'order_lists', 'order_details.order_lists_id', '=', 'order_lists.id' )
              ->where( 'order_lists.user_id', '=', $usId )
              ->orderBy( 'pro_count', 'DESC' )
              ->groupBy( 'product_id' )
              ->take( 6 )
              ->get();

但是我仍然只有pro_count和product_id

    {
        "pro_count": 22,
        "product_id": 733
    },
    {
        "pro_count": 15,
        "product_id": 85
    },

我需要回复中的产品详细信息。

1 个答案:

答案 0 :(得分:1)

我会使用joinDB::raw来解决这个问题,因为我发现在处理与函数查询相对的大型数据集时,它比Eloquent更有效-我也发现它更容易一些以这种方式建立我的查询。

 select(DB::raw('SELECT product_id, count(*) from order_details
     LEFT JOIN `order_lists` ON order_details.order_lists_id = order_lists.id
     WHERE order_lists.user_id = :authUser
     group by product_id
     order by count(*) DESC
     LIMIT 6', ['authUser => Auth::id()']);

您可能需要稍微处理一下,因为我不知道是否需要在查询中指定表名。

这是将您的order_listsorder_details tables加在一起,将其限制为auth用户的身份,将其按产品ID分组,按用户购买的产品数量进行排序,并限制到6个结果。