میلاد
3 سال پیش توسط میلاد مطرح شد
1 پاسخ

فیلتر بر اساس بیشترین فروش

جداول به شکل زیر هستن :
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;
    }

ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

پاسخ کوتاه اینکه خیلی کار راحتی نیست تا جایی که من میدونم و باید در بخش هایی از 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();

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام