اذهب إلى المحتوى

السؤال

نشر

لدي جدولين products و variants. العلاقة بينهم one to many . لا يحتوي جدول "products " على عمود price ، حيث يقع هذا العمود ضمن جدول variants. يتم تمثيل سعر المنتج بأقل سعر في variants في لوحة التحكم. في لوحة القيادة ، أحتاج إلى عمل فنكشن تقوم بفرز سعر المنتج من الأدنى إلى الأعلى وترقيمه. نظرا لطبيعة Eloquent builder وتصميم قاعدة بياناتي ، فالأمر ليس بهذه البساطة. لأنني يجب أن أستخدم model methods للوصول إلى أدنى سعر كالتالي:

protected function price(): Attribute
{
    return new Attribute(get: function(){
        return $this->variants()->get()->min('price');
    }); 
}

لقد جربت عدة أشياء مثل استخدام sortBy ولكن هذا فقط ل collection لذا لا يمكنني استخدام paginate ، حتى لو استطعت ، فسيكون ذلك ضغط كبير على الذاكرة إذا كان الاستعلام كبير جدا
كيف يمكنني فرز البيانات حسب السعر  قبل ترقيمها؟

Recommended Posts

  • 0
نشر

       يمكنك استخدام eager loading

باستخدام دالة withMin

<?php
        $products = Product::select("id", "name")

                        ->withMin('variants', 'price')

                        ->get()
          ->toArray();

حيث ترجع هذه الدالة مع كل منتج اقل سعر في ال variants

حيث تأخذ دالة withMin اول بارامتر هو اسم العلاقة والثاني هو اسم الحقل

حيث ترجع القيمة هكذا تقرييبا (تجريبي)

Array

(

    [0] => Array

        (

            [id] => 1

            [name] => Mobile

            [varinats_min_price] => 110

        )

    [1] => Array

        (

            [id] => 2

            [name] => Laptop

            [varinats_min_price] => 205

        )

)

 

  • 0
نشر

لحل هذه المشكلة في Laravel ، يمكنك استخدام الدالة orderBy() في الاستعلام الذي تريد استخدامه لفرز النتائج حسب السعر. يمكنك أيضًا استخدام الدالة select() لتحديد الأعمدة التي تريد استردادها من الاستعلام. يمكن استخدام هذا الأسلوب لتحديد الأدنى أو الأعلى أو أي آخر سعر يرغب المستخدم في البحث عنه.

وهنا مثال بسيط يمكنك استخدامه:

$products = Product::select('products.*', DB::raw('MIN(variants.price) as min_price'))
            ->leftJoin('variants', 'products.id', '=', 'variants.product_id')
            ->groupBy('products.id')
            ->orderBy('min_price', 'ASC')
            ->paginate(10);

في هذا المثال ، يتم استعلام جميع المنتجات ويتم استخدام leftJoin() للانضمام إلى جدول variants. يتم استخدام select() لتحديد الأعمدة التي سيتم استردادها وتم استخدام DB::raw() لحساب أدنى سعر. ثم يتم استخدام groupBy() لتجميع النتائج حسب id ويتم استخدام orderBy() لفرز النتائج حسب السعر من الأدنى إلى الأعلى. وأخيرًا ، يتم استخدام paginate() لعرض النتائج بشكل صفحات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...