首页 > 解决方案 > 如何改进这个 Laravel 查询

问题描述

$pfilters = ProductFilters
        ::whereIn('Tb_Product_filters.filter_value', $values)
        ->groupBy('Tb_Product_filters.product_id')
        ->join("Tb_Products","Tb_Products.id","Tb_Product_filters.product_id")
        ->join('Tb_Identities', 'Tb_Identities.id', '=', 'Tb_Products.employee_id')
        ->select(
            "Tb_Products.*",
            "Tb_Identities.first_name as fname",
            "Tb_Identities.last_name as lname"
        )
        ->get()
        ->toArray();

此查询为我提供了值数组中的所有产品,我只希望产品中包含所有值,例如

如果我有价值观 =[1,2,3]

上面的这个陈述给了我任何产品有value_id=12,3

我只希望产品收集 3 个属性,这意味着只有产品具有value_id=1并且 它应该搜索多行。23

我有 4 个表 products filters filters_value products_filters

首先我们从过滤器开始

任何过滤器都有一个或多个 filters_values 示例: filter = color , filters_value = [red,blue,green] 现在它们之间的关系取决于 filter_id 作为 forgen 键

产品表:当我创建产品时,我将选择产品过滤器和值示例:iphone = [color:glod, rom:128GB] 所以我将它们存储在 products_filters

products_filter 表将包含:product_id , filter_id , filter_value

所以假设我想要颜色:红色和 ROM 64GB 的产品?

标签: phplaravellaravel-5eloquent

解决方案


尝试这个

$pfilters = ProductFilters::select("
SELECT 
TB_PRODUCTS.*,
Tb_Identities.first_name as fname,
Tb_Identities.last_name as lname 
FROM Tb_Product_filters 
JOIN Tb_Products ON TB_Products.id=Tb_Product_filters.product_id 
JOIN Tb_Identities ON Tb_Identities.id=TB_Products.employee_id")
WHERE (Tb_Product_filters.filter_value = '$values[0]' OR Tb_Product_filters.filter_value = '$values[1]' OR Tb_Product_filters.filter_value = '$values[2]')

根据数组中有多少值,添加“OR Tb_Product_filters.filter_value = $values[X]”


推荐阅读