Написание Eloquent версии запроса с условием Not Where - PullRequest
0 голосов
/ 02 октября 2018

Как мне написать этот запрос в eloquent?

SELECT * 
FROM  `table`
WHERE 
    !(
        ((col0 = 'AA') AND (col1 = 'AA'))
     OR
        ((col0 = 'BB') AND (col1 = 'BB'))
    )

Это версия Eloquent, которую я имею:

        $query->where(function ($sub_query){
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
        });

Я не нашел ничего, чтобы сделать ГДЕ! (XXX)

Спасибо!

РЕДАКТИРОВАТЬ:

Я нашел решение:

https://laracasts.com/discuss/channels/eloquent/negate-entire-nested-where-clause

Есть код:

        $query->where(function ($sub_query){
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
            $sub_query->orWhere(function ($sub_sub_query){
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
                $sub_sub_query->where(function ($sub_sub_query){
                    // Some stuff
                });
            });
        }, null, null, 'AND NOT');

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Я нашел решение: https://laracasts.com/discuss/channels/eloquent/negate-entire-nested-where-clause

Есть код:

    $query->where(function ($sub_query){
        $sub_query->orWhere(function ($sub_sub_query){
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
        });
        $sub_query->orWhere(function ($sub_sub_query){
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
            $sub_sub_query->where(function ($sub_sub_query){
                // Some stuff
            });
        });
    }, null, null, 'AND NOT');
0 голосов
/ 02 октября 2018

Вы можете превратить ваш запрос во что-то вроде этого:

SELECT * 
FROM  `table`
WHERE 
    (
        ((col0 != 'AA') OR (col1 != 'AA'))
     AND
        ((col0 != 'BB') OR (col1 != 'BB'))
    )

, который дает тот же результат, и может быть выражен этим:

    $query->where(function ($sub_query){
        $sub_query->Where(function ($sub_sub_query){
            $sub_sub_query->where('col0' ,'!=', 'AA')
                          ->Orwhere('col1' ,'!=', 'AA');
        });
        $sub_query->Where(function ($sub_sub_query){
            $sub_sub_query->where('col0' ,'!=', 'BB')
                          ->Orwhere('col1' ,'!=', 'BB');
        });
    });
0 голосов
/ 02 октября 2018
WHERE
!(
    ((col0 = 'AA') AND (col1 = 'AA'))
  OR
    ((col0 = 'BB') AND (col1 = 'BB'))
)

эквивалентно

WHERE
    !((col0 = 'AA') AND (col1 = 'AA')) 
  AND
    !((col0 = 'BB') AND (col1 = 'BB'))

, поскольку НЕ (A ИЛИ B) === НЕ A И НЕ B

упрощение более становится

WHERE
    ( !(col0 = 'AA') OR !(col1 = 'AA') )  
  AND
    ( !(col0 = 'BB') OR !(col1 = 'BB') )

, поскольку НЕ А и В === НЕ А ИЛИ НЕ В

, поэтому запрос может быть построен следующим образом ..

$q->where(function($q) {
    $q->where('col0','!=','AA')->orWhere('col1','!=','AA');
})->where(function($q) {
    $q->where('col0','!=','BB')->orWhere('col1','!=','BB');
});
0 голосов
/ 02 октября 2018

попробуйте query изменить Model для вашего table model проверьте это и test

$object = Model::where([['col0' ,'<>', 'AA'],['col1','<>','AA']])
->orWhere([['col0','<>','BB'],['col1','<>', 'BB']])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...