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

كيفية ترتيب النتائج بإستخدام علاقة من جدول آخر في لارافيل Laravel؟

Emad Saif

السؤال

أريد عمل الإستعلام التالي في لارافيل 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...