我这里有 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
},
我需要回复中的产品详细信息。
最佳答案
我会通过使用 join
和 DB::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_lists
和 order_details 表
相加,将其限制为 auth 用户的表,按产品 ID 对其进行分组,并按这些表的数量对其进行排序为用户购买产品并将其限制为 6 个结果。
关于mysql - Laravel:为当前用户获取最多购买的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57754899/