راکت

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

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;
    }
میلاد
میلاد
@storm
ثبت پرسش جدید

پاسخ‌ها

1
محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

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

شاید پاسخ شما همین‌جا باشد

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

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