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 записей, и все они пройдены, но этот запрос возвращает другой результат. Что я здесь делаю неправильно? Любая помощь будет оценена


person Salman Zafar    schedule 29.09.2018    source источник
comment
У вас есть несколько условий, и одно из них orWhere('payment_module_id','like','%PM10____18____%'), и я думаю, что оно не обернуто (), как в вашем примере SQL, но вы получаете запрос:   -  person Lukasz Szozda    schedule 29.09.2018
comment
но тот же запрос отлично работает в mysql...   -  person Salman Zafar    schedule 29.09.2018
comment
Они не совпадают: 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 плюс отсутствует %   -  person Lukasz Szozda    schedule 29.09.2018
comment
@LukaszSzozda я изменил его, но все равно тот же результат. Я думаю, порядок не имеет значения   -  person Salman Zafar    schedule 29.09.2018


Ответы (1)


Вы группируете свой 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');
person Simon R    schedule 29.09.2018