Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > Laravel or MySQLi - Using Joins [Filter Categorie Product]



 

Laravel or MySQLi - Using Joins [Filter Categorie Product]

 



Topic : 134612



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์




รบกวนสอบถามเรื่องเทคนิคการ Join Advance Filter Category Product ครับ
สมมุติ ตอนนี้หน้า blade แบ่งออกเป็น 3 mutiselect box(brand,color,size) ตอนนี้นำ 3 mutiselect box รวมเข้าไปในตัวแปรตัวเดียวชื่อ $filter_lists แล้วนำไป whereIn (tb:filter_options_products) ค่าเลยไม่ได้อย่างที่ต้องการ เมื่อ เลือก แบรนตัวนั้นแล้ว Product ที่อยู่ใต้ filter ตัวนั้นออกมาครับ แต่เมื่อเลือกสี สินค้าที่ไม่ใช่แบรนนั้นก็ออกมาเหมือนกัน ผมจะทำอย่างไรบ้างครับ

ขอเป็นแนวทางของ mysql join ก็ได้ครับ

#ขอบคุณครับ

Code (PHP)
$products=Product::
join('category_products','category_products.product_id','=','products.id')
->where('category_products.categoy_id',$request->category_id)
->join('filter_options_products','filter_options_products.product_id','=','products.id')
->whereIn('filter_options_products.filter_option_id',$request->filter_lists)
->select('products.*')
->get();


dfs



Tag : PHP, MySQL, Ajax, jQuery, Laravel Framework









ประวัติการแก้ไข
2019-12-08 00:17:55
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2019-12-08 00:16:19 By : Genesis™ View : 1088 Reply : 9
 

 

No. 1



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


Code (SQL)
SELECT * FROM `products`
INNER JOIN `category_products` ON `category_products`.`product_id` = `products`.`id`
INNER JOIN `filter_options_products` ON `filter_options_products`.`product_id` = `products`.`id`
WHERE `category_products`.`category_id` = 2
AND `filter_option_id` IN (1,2,3)


ผมลองแบบนี้มันก็ไม่ออกมานี่นา?






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-08 10:30:46 By : mr.v
 


 

No. 2



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 1 เขียนโดย : mr.v เมื่อวันที่ 2019-12-08 10:30:46
รายละเอียดของการตอบ ::
ของผมผลลัพธ์ออกน้าพี่V
ผมอ้างอิงจาก Link https://www.endpoint.com/blog/2015/03/18/advanced-product-filtering-in-ecommerce ซึ่งผมเปลี่ยนจากการ Join เป็นในรูปแบบของ Laravel และ เปลี่ยนจาก URI slug เป็นการส่งผ่าน $.ajax filter_id,category_id แต่ผลออกมาเพี้ยนมากๆ
ผมนี่อ่อนเรื่องการ Join มากๆครับ - -"

หรือถ้าพี่ว่างๆรบกวนช่วยแปลตรงส่วนนี้ให้หน่อยได้มั้ย งง concept
Code (PHP)
SELECT products.*,
  COALESCE((SELECT GROUP_CONCAT(fo.url_slug) FROM filters_options_item foi
    JOIN filters_options fo ON fo.id = foi.filter_option_id
    WHERE foi.product_id = products.id), '') AS filters
FROM products
JOIN categories_products cp ON cp.product_id = products.id
JOIN categories c ON c.id = cp.category_id
WHERE c.url_slug = ?


Code (PHP)
#@filters = all applicable filters for current category
# loop through @filters
  # loop through filter options for this filter
  # filter product results to include any selected filter options for this filter
  # if there are no filter options selected for this filter, include all products
  # build the url for each filter option, to toggle the filter option (on or off)
# loop through @filters (yes, a second time)
  # loop through filter options for this filter
  # count remaining products for each filter option, if none, set filter option to inactive
  # build the final url for each filter option, based on all filters turned on and off


#ขอบคุณมากๆเลยครับ



ประวัติการแก้ไข
2019-12-08 11:41:01
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-08 11:39:44 By : Genesis™
 

 

No. 3



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


ผมไม่ค่อยชำนาญเรื่อง db ต้องยกให้คุณ @Chaidhanan

แต่ว่าทำไมไม่ลองใช้คำสั่งธรรมดา พวก ORM เมื่อก่อนผมเคยใช้กับตัว fuelphp มันก็เพี้ยนๆหน่อยๆเหมือนกัน พอเลาะมาเขียนคำสั่งธรรมดามันได้ผลตรงใจมากกว่า
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-08 13:46:42 By : mr.v
 


 

No. 4



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 3 เขียนโดย : mr.v เมื่อวันที่ 2019-12-08 13:46:42
รายละเอียดของการตอบ ::
รับทราบครับ เดี๋ยวไว้จะลองดู ขอบคุณสำหรับคำแนะนำนะครับ



ประวัติการแก้ไข
2019-12-08 14:14:53
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-08 14:13:10 By : Genesis™
 


 

No. 5



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


แก้ไขปัญหาได้แล้วครับ แต่ขอบคุณสำหรับคำแนะนำนะครับ
Code (PHP)
if(!isset($request->filter_lists))
        {
            $products=Product::
                join('categorie_product','categorie_product.product_id','=','products.id')
                ->where('categorie_product.categorie_id',$request->categorie_id)
                ->select('products.*')
                ->get();
        }else{

            for ($i=0; $i < count($request->filter_lists); $i++) { 
                $product[$i]=Product::
                    join('categorie_product','categorie_product.product_id','=','products.id')
                    ->where('categorie_product.categorie_id',$request->categorie_id)
                    ->join('filter_product','filter_product.product_id','=','products.id')
                    ->whereIn('filter_product.filter_id',$request->filter_lists[$i])
                    ->select('products.*')
                    ->get();
            }

            if(count($product) == 1)
            {
                $products=$product[0];
            }else{
                

                for ($i=0; $i < count($product) ; $i++) { 
                    $arr[$i]=array();
                    for ($a=0; $a < count($product[$i]); $a++) { 
                        array_push($arr[$i],$product[$i][$a]['id']);
                    }
                }

                for ($i=1; $i < count($arr); $i++) { 
                    $arr[0]=array_intersect($arr[0], $arr[$i]);
                }

                $products=Product::whereIn('id',$arr[0])->get();
            }

        }



ประวัติการแก้ไข
2019-12-08 21:47:24
2019-12-09 09:58:04
2019-12-09 09:58:35
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-08 21:46:19 By : Genesis™
 


 

No. 6



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



สถานะออฟไลน์


ต้องการแสดง product ที่ตรงกันกับ filter 3 อย่าง
ตารางหลัก คือ product
ตารางรอง คือ filter

Code (SQL)
select pd.* from product as pd
left join filter as ft 
  on ft.pd_id = pd.id 
  and ft.category in ( ?1, ?2, ?3)
group by pd.id
having count(pd.id)=3


ปล filter คุณต้องเขียน sub query เอาเอง นะ


ประวัติการแก้ไข
2019-12-10 03:05:23
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-10 02:58:48 By : Chaidhanan
 


 

No. 7



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 6 เขียนโดย : Chaidhanan เมื่อวันที่ 2019-12-10 02:58:48
รายละเอียดของการตอบ ::
ขอถามความรู้เพิ่มเติมครับ คือแบบว่า ถ้ามี 3 listbox แล้วให้ sub มัน intersect โดยถ้าอ้างอิงจาก listbox[0] เป็นหลักนี่ควรเขียน subjoin ยังไงครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-11 08:44:03 By : Genesis™
 


 

No. 8



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



สถานะออฟไลน์


ตัว laravel ผมไม่ค่อยคล่อง (เอาเป็นไม่เป็นดีกว่า เคยอ่านแค่ครั้งสองครั้ง ยังไปไม่ถีงไหน)

3 listbox ต้องถามก่อนว่า ทั้ง 3 ตัว มันอ้าง table เดียวกันหรือไม่ แต่ดูจาก chart db ที่ลง มันคนละ ตาราง
มี ตารางที่เกี่่ยวข้อง ก็คือ ตาราง filters ตรงจุดนี้ ควรสร้าง views เอาไว้เลย เพื่อใช้ในการคิวรี่ สั้นๆ

Code (SQL)
### --- vFilter ---- View in database
select ft.*, dt.ft_Type, dt.ref_op_or_cg, dt.ref_for_category_id,  
from filters as ft
inner join (
	select 'cg' as ft_Type, fc.category_id as ref_op_or_cg, fc.filter_id as ft_ID, fc.id ref_for_category_id, cp.product_id
	from filters_categories fc left join category_product cp on cp.category_id = fc.category_id
	union all
	select 'op' as ft_Type, id, filter_id, null, fop.product_id
	from filter_options as fo left join filter_options_product fop on fop.fileter_option_id = fo.id
) as dt on dt.ft_ID = ft.id


Code (PHP)
$sql="select pd.* from products pd
left join vFilter v
	on v.id = $request_filter_select_id ## อ้างอิงตาราง filters
	and (
		(
			v.ft_Type = 'cg'
			and
			v.ft_ID in (".implode(',', $request_filter_category).")) ## อ้างอิง category
		or
		(
			v.ft_Type = 'op' 
			and
			v.ft_ID in (".implode(',', $request_filter_option).")) ## อ้างอิง option
	)
	and pd.id = v.product_id
group by pd.id having count(ft.*)=".(count($request_filter_category)+count($request_filter_option);


ปล.
ทั้งนี้ทั้งนั้น เดาเอาทั้งนั้นเพราะไม่รู้ว่า input มาจากไหน ตัว list_box เอามาจากอะไรบ้าง


ประวัติการแก้ไข
2019-12-11 12:13:50
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-11 12:09:40 By : Chaidhanan
 


 

No. 9



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 8 เขียนโดย : Chaidhanan เมื่อวันที่ 2019-12-11 12:09:40
รายละเอียดของการตอบ ::
แค่นี้ก็ต้องขอบพระคุณมากๆแล้วครับ ร้องไห้กับ subjoin แปปครับ ขออ่านทำความเข้าใจแนวทางนี้ซักแปป

ปล.รูปแบบอ้างอิง filter ส่วนนี้ผมอ้างอิง จาก filter=>parent_id ครับ
- filter => id ไหนอ้างอิงจาก parent_id === 0 (id นั้นจะ sub filter ทั้งหมด)
- ส่วน category ใช้ (Many To Many) ตัว Category จะอ้างอิงจาก filter parent_id ที่เท่ากับ 0 เท่านั้น เราจะได้ category filter เฉพาะ category นั้นออกมา มันจะ customize มากๆครับในส่วนนี้ อารมเดียวกับ e-commerce ใหญ่ๆ เช่นพวก opencart , amazon , lazada



ประวัติการแก้ไข
2019-12-11 13:15:25
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-12-11 13:07:36 By : Genesis™
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : Laravel or MySQLi - Using Joins [Filter Categorie Product]
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่