【问题标题】:Laravel: Query builder builder returning different result than actual mysql queryLaravel:查询生成器生成器返回的结果与实际的 mysql 查询不同
【发布时间】:2018-09-29 09:33:43
【问题描述】:

我有一个列名为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 个条目,它们都通过了,但是这个查询返回了不同的结果.. 我在这里做错了什么? 任何帮助将不胜感激

【问题讨论】:

  • 您有多个条件,其中一个是 orWhere('payment_module_id','like','%PM10____18____%'),我猜它没有像您的 SQL 示例中那样用 () 包裹,但您会得到查询:
  • 但是同样的查询在 mysql 中运行良好 ...
  • 它们不一样: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';你的ORM版本缺少()围绕OR条件加上缺少%
  • @LukaszSzozda 我改了,但结果还是一样。我猜顺序没关系

标签: mysql laravel-5.6 laravel-query-builder


【解决方案1】:

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

$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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2014-05-13
    • 2015-12-14
    相关资源
    最近更新 更多