Выберите, где все 3 столбца не равны нулю одновременно (Laravel Query Builder) - PullRequest
0 голосов
/ 20 февраля 2019

Существует таблица articles БД (и модель Article), в которой (помимо прочего) имеются следующие 3 столбца:

  • col_1
  • col_2
  • col_3

Как выбрать все статьи, в которых эти 3 столбца , а не NULL одновременно ?

Итак, если col_1 = NULL и col_2 = NULL и col_3 = NULL - НЕ выбирайте (включайте) эти статьи.Но если один или несколько из этих столбцов НЕ NULL - выберите (включите) его.

Конструктор запросов для этого будет выглядеть следующим образом:

Article::select('articles.*')-> ... ->get();

Конечно, вместо ... будет выполняться проверка, если все эти 3 столбца не ноль одновременно .

Я знаю, что это неправильно:

Article::select('articles.*')
       ->whereNotNull('col_1')
       ->whereNotNull('col_2')
       ->whereNotNull('col_3')
       ->get();

... потому что он не будет выбирать (включать) статьи, где, например, один равен NULL (col_1) иостальные (col_2 и col_3) не равны NULL.

------------------ ОБНОВЛЕНИЕ: ------------------

Чтобы уточнить: я хочу выбрать (включить) статьи, где нет или один или два из col_1, col_2 и col_3 равно NULL, но нет, если все три NULL.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Построитель запросов, который вы ищете:

$articles = Article::where(function($q){
   return $q->whereNotNull('col_1')
       ->orWhereNotNull('col_2')
       ->orWhereNotNull('col_3');
})->get();

Причиной добавления предложений или вместе в замыкании является to group them.Так что если в будущем вы хотели бы добавить еще один, где, как:

SELECT
    *
FROM
    `articles`
WHERE 
    (`col_1` IS NOT NULL OR `col_2` IS NOT NULL OR `col_3` IS NOT NULL)
    AND
    `type` = 1
;

Вы можете напрямую добавить:

$articles = Article::where(function($q){
   return $q->whereNotNull('col_1')
       ->orWhereNotNull('col_2')
       ->orWhereNotNull('col_3');
})
->where('type', 1)->get();

Если вы сделаете это:

$articles = Article::orWhereNotNull('col_1') 
   ->orWhereNotNull('col_2')
   ->orWhereNotNull('col_3')
   ->where('type', 1)
   ->get();

Это делает ниже запрос, который не , что вам нужно:

SELECT
    *
FROM
    `articles`
WHERE 
    `col_1` IS NOT NULL 
    OR `col_2` IS NOT NULL 
    OR `col_3` IS NOT NULL
    AND `type` = 1
;
0 голосов
/ 20 февраля 2019

Запрос, который вы ищете, будет:

SELECT
    *
FROM
    `articles`
WHERE
    `col_1` IS NOT NULL
    OR `col_2` IS NOT NULL
    OR `col_3` IS NOT NULL
;

В Laravel это приведет к следующему:

Article::orWhereNotNull('col_1') 
   ->orWhereNotNull('col_2')
   ->orWhereNotNull('col_3')
   ->get();

Точно такой же выбор в select('articles.*') выполняетсяКрасноречиво, если я не ошибаюсь.Возможно, первое orWhereNotNull должно быть whereNotNull, но также и то, что вы должны выяснить сами.

...