【问题标题】:How to make complexe query with laravel Query Builder如何使用 laravel Query Builder 进行复杂查询
【发布时间】:2016-05-12 23:11:59
【问题描述】:

让我们考虑一下我有这张表parameters 和一些样本数据的情景。

我需要将这些数据查询为如下所述的三类。

query1 = 获取所有具有:param1=param2=param3= 100% 的记录,因为在这种情况下,输出是第一条记录。这个查询没有问题。

query2 = 获取所有具有:at least param1 < 80 OR param2 < 80 OR param3 < 80 OR all 的记录,因为在这种情况下,输出是第二条和第三条记录。

query3 = 获取所有具有:at least param1 >= 80 OR param2 >= 80 OR param3 >= 80 BUT NOT ALL EQUAL to 100% 的记录,因为在这种情况下,输出是第四和第五条记录。

我真的很喜欢 query2 和 query3。下面是我使用 laravel 查询生成器的查询。

            $query = DB::table('parameters');                
            if ($query === 1) {
                $query->where('param1', '=', 100)
                      ->where('param2', '=', 100)
                      ->where('param3', '=', 100);
            }elseif ($query === 2) {
                $query->where('param1', '<', 80)
                      ->where('param2', '<', 80)
                      ->where('param3', '<', 80);
            }else{
                $query->whereBetween('param1', [80, 100])
                      ->whereBetween('param2', [80, 100])
                      ->whereBetween('param3', [80, 100]);
            }
            $result = $query->get();

希望我的问题足够明确。提前感谢您的帮助。

【问题讨论】:

    标签: mysql database laravel-5 laravel-query-builder


    【解决方案1】:

    我认为使用三个参数的平均值会更容易,因为你有一个要尊重的间隔。

    //param_avg = (param1 + param2 + param3)/3;
    
    $query = DB::table('parameters')->get();
    //For query 1
        $query->where('param1', '=', 100)
              ->where('param2', '=', 100)
              ->where('param3', '=', 100); 
    
    //For query2
     $query->where('param1', '<', 100)
           ->where('param2', '<', 100)
           ->where('param3', '<', 100);
    
    //For query3
    $query->select(DB::raw('WHERE (param1 + param2 + param3)/3 <=80 AND (param1 + param2 + param3)/3 <100'));
    

    希望对你有所帮助。

    【讨论】:

    • 很高兴知道它有帮助。快乐编码(^_^)
    【解决方案2】:

    你不能在一个查询中使用三个 whereBetween() 和你的 query2 = 你有提到 param1,param2,param3

    $query = DB::table('parameters')
                    ->whereBetween('param1', [0, 80])->get();
    

    同理查询3

    $query = DB::table('parameters')
                        ->whereBetween('param1', [80, 100])->get();
    

    对每一列使用查询 对所有查询使用规则 使用此链接 - link

    编辑答案

    public function getData($id)
        {
            $query = DB::table('parameters')->find($id);
    
            if($query->param1==100 && $query->param2==100 && $query->param3==100){
    
            }elseif($query->param1<80 or $query->param2<80 or $query->param3<80){
    
            }else{
    
            }
    
        }
    

    正确路由这个函数你会得到输出:)

    【讨论】:

    • 感谢您的回复。但是,如果查询不能采用三个 whereBetween() ,我将如何过滤这三个参数?
    • 我已经编辑了我的答案,我不清楚你需要输出什么,只需检查我的答案,它会帮助你确定
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2020-02-20
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2015-10-02
    • 2019-10-31
    相关资源
    最近更新 更多