首页 > 解决方案 > Laravel:查询生成器生成器返回与实际 mysql 查询不同的结果

问题描述

我有一个列名为firmware_flash_result 的表,它要么失败要么通过。查询生成器为 Pass 返回正确的结果,但对于失败,它返回错误的结果。

实际查询和结果:

 SELECT COUNT(DISTINCT `payment_module_id`) 
 FROM `payment_prod_pograms` 
 WHERE `created_at` >= "2018-09-17 00:00:00" AND 
       (
        `payment_module_id` LIKE "PB10____18____" OR 
        `payment_module_id` LIKE "PM10____18____" 
       ) AND 
       CHAR_LENGTH(`payment_module_id`) = 14 AND 
       `firmware_flash_result` = "FAIL";

+-------------------------------------+
| COUNT(DISTINCT `payment_module_id`) |
+-------------------------------------+
|                                   0 |
+-------------------------------------+

Laravel 查询生成器:

$payment_prod_failed_test = DB::table('payment_prod_pograms')
        ->where('created_at','>=','2018-09-17 00:00:00')
        ->whereRaw('char_length(payment_module_id) = 14')
        ->where('payment_module_id','like','%PB10____18____%')
        ->orWhere('payment_module_id','like','%PM10____18____%')
        ->where('firmware_flash_result','=','FAIL')
        ->distinct()
        ->count('payment_module_id');

上面的查询返回结果 453,这是不可能的。

经过一番调试,我发现:

->orWhere('payment_module_id','like','%PM10____18____%')

导致这个错误是为什么?

数据库中有 1515 个条目,它们都通过了,但是这个查询返回了不同的结果。我在这里做错了什么?任何帮助将不胜感激

标签: mysqllaravel-5.6laravel-query-builder

解决方案


您将 where payment_module_id 分组为 %PB10____18____% 或 %PM10____18____% ,因此您需要在雄辩的查询中执行相同的操作。这是通过使用闭包来完成的。

$payment_prod_failed_test = DB::table('payment_prod_pograms')
        ->where('created_at','>=','2018-09-17 00:00:00')
        ->whereRaw('char_length(payment_module_id) = 14')
        ->where(function($query) { 
            $query->where('payment_module_id','like','%PB10____18____%')
                  ->orWhere('payment_module_id','like','%PM10____18____%');
        })
        ->where('firmware_flash_result','=','FAIL')
        ->distinct()
        ->count('payment_module_id');

推荐阅读