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

السؤال

نشر

أريد عمل الإستعلام التالي في لارافيل Laravel:

$products = UserProducts::with('products')->where('user_id', '=', $user->id)
        ->where('count', '>', 0)
        ->get();

ولكن حاولت ترتيب النتائج بإستخدام بإستخدام العمود type الموجود في الجدول products لذلك قمت بإضافة التابع orderBy كما في الكود التالي:

$products = UserProducts::with('products')->where('user_id', '=', $user->id)
        ->where('count', '>', 0)
        ->orderBy('products.type')
        ->get();

ولكن يظهر هذا الكود الخطأ التالي:

Unknown column 'item.type' in 'order clause'

ما حل هذه المشكلة؟ كيف أقوم بترتيب النتائج بإستخدام عمود معين في جدول مختلف في لارافيل Laravel؟

Recommended Posts

  • 1
نشر (معدل)

لمعرفة أين يقع الخطأ فى جزء ال orderBy علينا معرفة كيف يقوم laravel بتحويل هذا الكود الى امر sql.

إن laravel يقوم بتنفيذ امرين , للحصول اولا على UserProducts ثم بعد ذلك يقوم بتنفيذ امر اخر للحصول على ال products . لنرى كيف يقوم بتنفيذ ذلك 

SELECT * FROM `user_products` WHERE `user_id` = 1;

SELECT * FROM `products` WHERE `products`.`id` in (1)

هنا اولا يقوم بتنفيذ السطر الاول للحصول على userProducts ثم بعد ذلك يأخذ ال id الخاص بال product ثم يقوم بتمريرها للسطر الثانى . ولذلك فإن orderBy ستكون خطأ لانه سيقوم بترتيب السطر الاول عن طريق products.type اللتى لا توجد فى هذه العملية .

ولحل تلك المشكلة هناك اكثر من حل وقد اخترت لك اسهل طريقتين .

  1. إن كنت تريد ان تقوم بترتيب النتيجة دائما ب product.type فالحل الافضل ان تقوم بالترتيب فى ملف ال model 
      public function products()
        {
            return $this->hasMany(Product::class)->orderBy('type');
        }

    وبذلك ستتاكد ان فى حالة استدعاء ال products ستكون مرتبة ب ال type .

  2. والطريقة الثانية عن طريق الدمج join 

    UserProducts::join('products',function($join) {
     $join->on('products.id', '=', 'user_product.product_id')
     ->where('user_product.user_id', '=', $user->id)
     ->where('user_product.count', '>', 0);
    })->orderBy('products.type')->get();

    والافضل هنا ان تقوم باستخدام select لتحديد الاعمده التى تريدها حتى لا يحدث خطأ إن كان هناك اعمده لها نفس الاسم فى الجدولين

تم التعديل في بواسطة محمد عاطف11
  • 1
نشر

يمكنك معاملة الناتج كتجميعة واستعمال التابع sortBy لذات الغرض، يجب حقن Closure إلى التابع sortBy كـ:

$products = UserProducts::with('products')->get()
   ->sortBy(function($userProduct) { 
       return $userProduct->products->type;
   }
)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...