【问题标题】:How to improve this Laravel query如何改进这个 Laravel 查询
【发布时间】:2019-11-02 08:55:32
【问题描述】:
$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 = 123 它应该搜索多行。

我有 4 张桌子 产品 过滤器 过滤器值 products_filters

首先我们从过滤器开始

任何过滤器都有一个或多个过滤器值 例如: filter = color , filters_value = [red,blue,green] 现在它们之间的关系依赖于 filter_id 作为 forgen key

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

products_filter 表将包含 ; product_id , filter_id , filter_value

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

【问题讨论】:

  • 那么'ProductFilters'有很多Tb_Product_filters吗?你和你的模型有关系吗?
  • 不,我没有在他们之间建立任何关系
  • @laravelmail 您说您想要具有value_id = 123 的产品。这怎么可能? value_id 是数组吗?
  • 让我为你解释一下
  • 我有 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 的产品?

标签: php laravel laravel-5 eloquent


【解决方案1】:

我修好了 这就是答案

$values = explode(",", $request->input('values'));
        $organization_id = $request->input('organization_id');
        $prodicts_filters_ids = ProductFilters::whereIn('filter_value', $values)->groupBy("product_id")->select("product_id")->get()->toArray();
        $products_have_values = [];
        foreach ($prodicts_filters_ids as $pfids) {
            $filers = ProductFilters::where([["product_id", $pfids['product_id']]])->Select("filter_value")->get()->toArray();
            $all_product_filters_Values_ids = [];
            foreach ($filers as $filer) {
                $all_product_filters_Values_ids[] = $filer['filter_value'];
            }

            $any_dif = array_diff($values,$all_product_filters_Values_ids);
            if(count($any_dif)<=0){
                $products_have_values[] = $pfids['product_id'];
            }


        }

        $products = Product::where("Tb_Products.organization_id",$organization_id)->whereIn("Tb_Products.id",$products_have_values)
            ->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();


        return $products;

【讨论】:

    【解决方案2】:

    试试这个

    $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]”

    【讨论】:

    • 它不会工作,因为值长度未知它是动态的
    • 你的查询也和我给定的查询一样
    • 然后你必须创建一个动态的 ->whereRaw() 语句并用 ->whereIn(...) 替换它。据我所知,您的要求没有神奇的解决方案。您必须构建原始表达式并注入字符串。你可以在这里找到灵感stackoverflow.com/questions/43461076/…
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多