Laravel получает количество строк столбцов с условием

#php #mysql #laravel #eloquent #laravel-query-builder

Вопрос:

Предположим, если у меня есть таблица

 ID      Col1     Col2       Col3       Col4     Col5

1       Hello    ""         Hi          ""       ""
2       two      ""         Hi          here     ""
 

Я хочу получить количество Col(X), не включая пустой столбец. Поэтому для записи 1 у меня должно быть количество 2 , а для записи 2 у меня есть 3

Как я могу это сделать в MySQL или в «Красноречивом» или «Построителе запросов» Laravel? Заранее спасибо.

Ответ №1:

То, что вы хотите, — это суммировать не пустые поля. В MySQL это выглядит так:

 SELECT *, SUM((Col1!='')   (Col2!='')   (Col3!='')   (Col4!='')   (Col5!='')) as NotEmptyFields 
FROM table 
GROUP BY ID;
 

В Laravel это выглядит так:

 Model::select(DB::raw('*, SUM((Col1!="")   (Col2!="")   (Col3!="")   (Col4!="")   (Col5!="")) as NotEmptyFields'))
    ->groupBy('ID')
    ->get();
 

Ответ №2:

Ответ может стать очень медленным для больших наборов данных.

Попробуй вот так.

 DB::table('model')
    ->select(DB::raw('
        (is_null(Col1) OR Col1 = '')  
        (is_null(Col2) OR Col2 = '')  
        (is_null(Col3) OR Col3 = '')  
        (is_null(Col4) OR Col4 = '')  
        (is_null(Col5) OR Col5 = '') 
            as NumberofNulls'
    ))
 

Теперь это должно подсчитывать столбцы с нулевой или пустой строкой в них

Комментарии:

1. is_null считает ли пустые строки? так как моя таблица не может быть аннулирована. когда пусто. он остается пустым, а не пустым

2. нет, дай мне посмотреть, смогу ли я это отредактировать

3. Хорошо, попробую ваше решение, сэр

Ответ №3:

Попробуйте это решение:

 $data = DB::table('MyTable')->get();
 

Получите все данные из таблицы, используя запрос, подобный этому, в laravel. Он возвращает массив объектов. Поэтому повторите свой массив, используя для каждого цикла, и проверьте столбцы или пустые, или нет.

Если какой-либо столбец пуст, ничего не делайте.

Но если какой-либо столбец имеет значение count 1, добавьте его в свой результирующий массив.

 $result = [];

foreach($data as $object)
{
    $result[$object->id] = 0;

    foreach($object as $key => $value) 
    {        
        if(!empty($value))
        {
            if($key != 'id')
            {
                $result[$object->id] = $result[$object->id]   1;
            }
        }
    }
}

var_dump($result);
 

Комментарии:

1. можете ли вы объяснить свой ответ ?

2. да, конечно, проверьте мой обновленный ответ

3. я. пробовал, но я не понимаю полученных результатов

4. результат похож на этот массив ( [1] => 2 [2] =>> 3 ) идентификатор 1, имеющий 2 отсчета, и идентификатор 2, имеющий 3 отсчета.

5. кажется запутанным.