جشنواره بهارانه راکت! ۳۵% تخفیف ویژه بر روی دوره‌های آموزشی

مشاهده دوره‌ها
ثانیه
دقیقه
ساعت
روز
25 پاسخ

فیلتر بر اساس قیمت

سلام یک کمک میخوام برای فیلتر قیمت
رابطه به شکل زیر هست
هر محصول چند فروشنده داره
و هر فروشنده میتونه چندین رنگ برای محصول ایجاد کنه البته جدول رنگ از قبل ایجاد شده و طی یک رابطه با جدول واسط قیمت قرار میگیره.
حالا میخوام بیشترین قیمت از رنگ هر محصول انتخاب کنم و مرتب سازی بر اساس اون قیمت باشه.

@ali.bayat
@hesammousavi


ثبت پرسش جدید
محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

@ali.bayat
@hesammousavi
لطفا در این مورد کمک کنید خیلی واجبه


woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@ghomi2018
لطفا ساختار دیتابیس رو بیشتر شرح بدید. اینکه table ها چه ریلیشنی با هم دارند


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

جداول اصلی به شکل زیر هستن :
product : id , title , slug , description
seller : id , user_id , name
category : id , name , slug , parent_id
color : id , name , value


جداول واسط به شکل زیر هستن :
color_product : seller_id , color_id , product_id , price , qty , approved
category_product : category_id , product_id

کوئری که زده میشه در صفحه دسته بندی ها به شکل زیر هستش :

   $categories = $category->children->flattenTree()->pluck('id');
    $categories->push($category->id);

    $products = \App\Product::whereHas('categories' , function ($query) use ($categories) {
        return $query->whereIn('id' , $categories);
    });

تا ایجا بدون مشکل تمام محصولات اون دسته با زیر دسته میاره و مشکل از این به بعد هستش که میخوام بر اساس جدول واسطی که بین رنگ و محصول وجود داره بر اساس بالا ترین قیمت رنگ تعریف شده محصولات ترتیب بندی کنه.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

میخوام بیشترین قیمت از رنگ هر محصول انتخاب کنم

مگر محصولات با رنگ های مختلف، قیمت های مختلف دارند؟

یه نکته : ببینید کوئری های پیچیده در عمل ساده هستند
چند تا جدول هست که شما Join میزنید و اصلاعات لازمه از هر کدوم رو میگیری
و بر اساس فیلدهایی که میخواهی دسته بندی (group) میکنی
منظور از این توضیحات اینکه شما ابتدا سعی کن این کوئری رو بنویسی (کاملا SQL)
بعد برای بردنش توی لاراول و استفاده از کوئری بیلدر و الکوئنت کارت خیلی راحت میشه

در ضمن حواست به محدودیت های aggregate ها هم باشه


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

البته من به این شکل در ادامه عمل میکنم :

     $products = $products->with(['colors' => function ($q) {
            $q->orderByDesc('price');
        }])->get();

اما میاد فقط رنگ هارو به ترتیب قیمت در آبجکت محصول ترتیب بندی میکنه


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

@ali.bayat
بله چون فروشنده های مختلف دارن
این یک وبسایت چند فروشندگی ساده هست


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

توضیح تصویر رو وارد کنید

اینم خروجی


woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
0

@ghomi2018
ببینید چون شما قیمت رو برای هر محصول می خواهید، باید groupBy بزنید روی productid . ببینید کوری زیر کار میکنه براتون

     $products = $products->with(['colors' => function ($q) {
            $q->groupBy('product_id')->orderByDesc('price');
        }])->get();

بعد از اینکه order کردید باید برای هر محصول اولی رو بگیرید


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش آپدیت شد
0

خیر کار نمیکنه

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'color_product.product_id' in 'group statement' (SQL: select * from `products` where exists (select * from `categories` inner join `category_product` on `categories`.`id` = `category_product`.`category_id` where `products`.`id` = `category_product`.`product_id` and `id` in (29, 31, 183, 184, 40, 182, 30)) group by `color_product`.`product_id`) 

و

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'zabam_dan.colors.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select `colors`.*, `color_product`.`product_id` as `pivot_product_id`, `color_product`.`color_id` as `pivot_color_id`, `color_product`.`price` as `pivot_price`, `color_product`.`seller_id` as `pivot_seller_id`, `color_product`.`qty` as `pivot_qty` from `colors` inner join `color_product` on `colors`.`id` = `color_product`.`color_id` where `color_product`.`product_id` in (139, 140, 141, 148, 161, 163, 175, 176, 177, 178, 180, 181, 203, 204, 205, 206, 207, 208, 209, 210, 211, 221, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 297, 298, 300, 316, 319, 1353, 1690, 1691) group by `product_id` order by `price` desc) 

woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@ghomi2018
قبول دارم این کار اشتباه بود!


woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
0

@ghomi2018
ببخشید من ذهنم بایاس شده بود رو query builder . روش زیر رو هم امتحان کنید اگر اروری گرفتید بفرستید . احتمالا جوابه فقط DB facade رو use کنید یادتون نره

DB::table('products')->select([
    'products.*',
    DB::raw('MAX ( color_product.price ) as max_price')
])
    ->leftJoin('color_product', 'color_product.product_id', '=', 'products.id')
    ->groupBy('color_product.product_id')
    ->get();

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0
SQLSTATE[42S02]: Base table or view not found: 1051 Unknown table 'product' (SQL: select `product`.*, MAX ( color_product.price ) as max_price from `products` left join `color_product` on `color_product`.`product_id` = `products`.`id` group by `color_product`.`product_id`) 

woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
0

@ghomi2018
خب خودتون product رو به products تغییر بدید. اشتباه نوشتم. اگر باز ارور داد کوری زیر رو تست کنید

DB::table('products')->select([
    'products.id',
    DB::raw('MAX ( color_product.price ) as max_price')
])
    ->leftJoin('color_product', 'color_product.product_id', '=', 'products.id')
    ->groupBy('color_product.product_id')
    ->get();

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0
SQLSTATE[42000]: Syntax error or access violation: 1630 FUNCTION zabam_dan.max does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual (SQL: select `products`.*, max ( color_product.price ) as max_price from `products` left join `color_product` on `color_product`.`product_id` = `products`.`id` group by `color_product`.`product_id`) 

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0

میتونم دسترسی انی دسک بدم


woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
0

@ghomi2018
ببینید اون MAX یه فانکشن built in داخل mysql هست. باید اجرا بشه. کوری زیر رو تست کن

DB::table('products')->select([
    'products.id',
    DB::raw('MAX(`color_product.price`) as max_price')
])
    ->leftJoin('color_product', 'color_product.product_id', '=', 'products.id')
    ->groupBy('color_product.product_id')
    ->get();

woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

@ghomi2018
مشکل فاصله هست . فاصله بین MAX و پرانتزهاشو حذف کن ویعنی اینجوری

MAX()

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'color_product.price' in 'field list' (SQL: select `products`.`id`, MAX(`color_product.price`) as max_price from `products` left join `color_product` on `color_product`.`product_id` = `products`.`id` group by `color_product`.`product_id`) 

woz
تخصص : fan of open source world
@wozniak 4 سال پیش مطرح شد
0

سینتکس ارور. اینو امتحان کن

DB::table('products')->select([
    'products.id',
    DB::raw('MAX(color_product.price) as max_price')
])
    ->leftJoin('color_product', 'color_product.product_id', '=', 'products.id')
    ->groupBy('color_product.product_id')
    ->get();

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 4 سال پیش مطرح شد
0
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'zabam_dan.products.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select `products`.`id`, MAX(color_product.price) as max_price from `products` left join `color_product` on `color_product`.`product_id` = `products`.`id` group by `color_product`.`product_id`) 

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

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