جداول به شکل زیر هستن :
product : id , title , slug , description
order_items: id , user_id , product_id
من واسه مرتب سازی روی کوری اصلی یک اسکوب فیلتر نوشتم حالا میخوام فیلتر بر اساس بیشترین فروش هم بزارم چطور میشه این کارو کرد؟ باswitch
public function scopeFilter($query)
{
if (request()->has('sortBy')) {
$sortBy = request()->sortBy;
switch ($sortBy) {
case 'latest':
$query->latest();
break;
case 'oldest':
$query->oldest();
break;
default:
$query;
break;
}
}
return $query;
}
پاسخ کوتاه اینکه خیلی کار راحتی نیست تا جایی که من میدونم و باید در بخش هایی از sql خام و join و groupBy و ... استفاده کنید. به اضافه اینکه اما و اگر های زیادی هم وجود داره که در هر پروژه میتونه متفاوت باشه. اما بصورت کلی نمونه کد زیر به نظرم تا حدی میتونه ایده برای شروع بده. بعد از فهمیدن منطق کلی کار باید مرحله به مرحله جلو برید تا به خواسته نهاییتون برسید:
Product::with('sales')
->leftJoin('orders','products.id','=','orders.product_id')
->selectRaw('products.*, COALESCE(sum(orders.item_count),0) total')
->groupBy('products.id')
->orderBy('total','desc')
->take(5)
->get();
یا برای روابط یکم پیچیده تر many to many:
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();
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟