2017-07-14 106 views
0

我有一個查詢,現在我需要獲得所有具有一些過濾器選項的產品。使用Laravel,你可以使用whereHas來獲取只有過濾選項的產品。我怎樣才能做到「原始」查詢?獲取有選項的產品

雄辯建設者:

$db = app('db') 
     ->table('products') 
     ->join('product_category', 'product_category.product_id', '=', 'products.id') 
     ->rightJoin('categories', 'categories.id', 'product_category.category_id') 
     ->leftJoin('brands', 'brands.id', '=', 'products.brand_id') 
     ->leftJoin('variants', 'variants.product_id', '=', 'products.id') 
     ->leftJoin('product_contents', 'product_contents.product_id', '=', 'products.id') 
     ->leftJoin('translations_languages', 'translations_languages.id', '=', 'product_contents' . '.language_id') 
     ->leftJoin('filter_option_product', 'filter_option_product.product_id', '=', 'products.id') 
     ->where('categories.id', '3396326') 
     ->where('variants.is_default', true) 
     ->where('translations_languages.title_short_two', 'nl') 
     ->where('filter_option_product.option_id', 177) 
     ->whereIn('products.id', [ 31025567, 36117839, 36259742, 36260666 ]) 
->get(); 

原始查詢:

SELECT 
    * 
FROM 
    `products` 
INNER JOIN `product_category` ON `product_category`.`product_id` = `products`.`id` 
RIGHT JOIN `categories` ON `categories`.`id` = `product_category`.`category_id` 
LEFT JOIN `brands` ON `brands`.`id` = `products`.`brand_id` 
LEFT JOIN `variants` ON `variants`.`product_id` = `products`.`id` 
LEFT JOIN `product_contents` ON `product_contents`.`product_id` = `products`.`id` 
LEFT JOIN `translations_languages` ON `translations_languages`.`id` = `product_contents`.`language_id` 
LEFT JOIN `filter_option_product` ON `filter_option_product`.`product_id` = `products`.`id` 
WHERE 
    `categories`.`id` = 3396326 
AND `variants`.`is_default` = true 
AND `translations_languages`.`title_short_two` = 'nl' 
AND `products`.`id` IN(31025567, 36117839, 36259742, 36260666) 
AND (`filter_option_product`.`option_id` = 174 AND `filter_option_product`.`option_id` = 1) 

回答

0

如果希望對一個NOT NULL確實有一排filter_option_product,然後在where子句測試的所有行該表中的列:

SELECT 
    * 
FROM 
    `products` 
INNER JOIN `product_category` ON `product_category`.`product_id` = `products`.`id` 
RIGHT JOIN `categories` ON `categories`.`id` = `product_category`.`category_id` 
LEFT JOIN `brands` ON `brands`.`id` = `products`.`brand_id` 
LEFT JOIN `variants` ON `variants`.`product_id` = `products`.`id` 
LEFT JOIN `product_contents` ON `product_contents`.`product_id` = `products`.`id` 
LEFT JOIN `translations_languages` ON `translations_languages`.`id` = `product_contents`.`language_id` 
LEFT JOIN `filter_option_product` ON `filter_option_product`.`product_id` = `products`.`id` 
WHERE NOT(`filter_option_product`.`option_id` IS NULL) 
+0

該產品有更多的一個fil 「多對多」,所以這不會幫助我出局 –

+0

只需將它們添加到哪裏。這只是爲了展示如何匹配所有至少有一個過濾器的項目。 –