سلام یک کمک میخوام برای فیلتر قیمت
رابطه به شکل زیر هست
هر محصول چند فروشنده داره
و هر فروشنده میتونه چندین رنگ برای محصول ایجاد کنه البته جدول رنگ از قبل ایجاد شده و طی یک رابطه با جدول واسط قیمت قرار میگیره.
حالا میخوام بیشترین قیمت از رنگ هر محصول انتخاب کنم و مرتب سازی بر اساس اون قیمت باشه.
جداول اصلی به شکل زیر هستن :
product : id , title , slug , description
seller : id , user_id , name
category : id , name , slug , parent_id
color : id , name , value
کوئری که زده میشه در صفحه دسته بندی ها به شکل زیر هستش :
$categories = $category->children->flattenTree()->pluck('id');
$categories->push($category->id);
$products = \App\Product::whereHas('categories' , function ($query) use ($categories) {
return $query->whereIn('id' , $categories);
});
تا ایجا بدون مشکل تمام محصولات اون دسته با زیر دسته میاره و مشکل از این به بعد هستش که میخوام بر اساس جدول واسطی که بین رنگ و محصول وجود داره بر اساس بالا ترین قیمت رنگ تعریف شده محصولات ترتیب بندی کنه.
میخوام بیشترین قیمت از رنگ هر محصول انتخاب کنم
مگر محصولات با رنگ های مختلف، قیمت های مختلف دارند؟
یه نکته : ببینید کوئری های پیچیده در عمل ساده هستند
چند تا جدول هست که شما Join میزنید و اصلاعات لازمه از هر کدوم رو میگیری
و بر اساس فیلدهایی که میخواهی دسته بندی (group) میکنی
منظور از این توضیحات اینکه شما ابتدا سعی کن این کوئری رو بنویسی (کاملا SQL)
بعد برای بردنش توی لاراول و استفاده از کوئری بیلدر و الکوئنت کارت خیلی راحت میشه
در ضمن حواست به محدودیت های aggregate ها هم باشه
البته من به این شکل در ادامه عمل میکنم :
$products = $products->with(['colors' => function ($q) {
$q->orderByDesc('price');
}])->get();
اما میاد فقط رنگ هارو به ترتیب قیمت در آبجکت محصول ترتیب بندی میکنه
@ghomi2018
ببینید چون شما قیمت رو برای هر محصول می خواهید، باید groupBy بزنید روی productid . ببینید کوری زیر کار میکنه براتون
$products = $products->with(['colors' => function ($q) {
$q->groupBy('product_id')->orderByDesc('price');
}])->get();
بعد از اینکه order کردید باید برای هر محصول اولی رو بگیرید
خیر کار نمیکنه
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)
@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();
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`)
@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();
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`)
@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();
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`)
سینتکس ارور. اینو امتحان کن
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();
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`)
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟