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`) 

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

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