mysql - Laravel:为当前用户获取最多购买的产品

标签 mysql laravel eloquent

我这里有 3 个表(order_lists、order_details、products)

表 order_lists 包含以下 user_id

表 order_details 包含以下 order_lists_id product_id

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

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

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

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

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

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

UPDATE

正如@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' ) );

Update

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
    },

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

最佳答案

我会通过使用 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 表 相加,将其限制为 auth 用户的表,按产品 ID 对其进行分组,并按这些表的数量对其进行排序为用户购买产品并将其限制为 6 个结果。

关于mysql - Laravel:为当前用户获取最多购买的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57754899/

相关文章:

php - Laravel 查询生成器在直接 SQL 返回结果的地方返回空

php - laravel - 使用 select() 和 with() 进行查询不起作用

c# - 使用 MySqlDataReader 计算特定记录数

php - 连接PHP与Android检查Mysql数据库中是否存在值

PHP 数据库删除函数只适用于数据库的第一行?

php - Laravel - 查询以多对多关系连接表

php - YouTube Vid Attached - 在 Laravel 中删除 'posts' 表中的类别后,如何从 'categories' 表中删除关联的 Category_id?

php - Laravel whereHas 的多对多关系

mysql - 同一个表内的Left Join SQL

php - Laravel Eloquent : Model attribute with conditional concatenation