我这里有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
},
我需要回复中的产品详细信息。
答案 0 :(得分:1)
我会使用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 tables
加在一起,将其限制为auth用户的身份,将其按产品ID分组,按用户购买的产品数量进行排序,并限制到6个结果。