Я работаю с laravel чуть более 8 месяцев, и у меня есть проблема, когда я хочу показать процент завершения в таблице. поэтому идея, которую я имел, заключалась в том, что я собирался подсчитать количество столбцов, которые не являются нулевыми в строке, а затем разделить на количество столбцов в строке и умножить на 100.
Что-то вроде (NumberOfNotNullColumns/totalNumberOfColumns)*100
Но проблема в том, что я не могу получить NumberOfNotNullColumns в выбранной строке.
$pos_info = DB::select(DB::raw('SHOW COLUMNS FROM resource'));
$pos_info_act = DB::select(DB::raw('SELECT count(*) from resource WHERE * IS NOT NULL AND user_id = '.$resource->user_id));
foreach ($pos_info as $item) $base_columns += 1;
$percentage = ($pos_info_act/$pos_info)*100;
как видите, у меня нет опыта работы с MySQL
Вы можете выбрать все необходимые столбцы, отфильтровать столбцы с нулевым значением и вычислить. Пробовали ли вы какой-либо код?
Пожалуйста, не могли бы вы предоставить код, который вы написали, чтобы попробовать эту функцию.
@LucasPiazzi, я хочу сделать то же самое с несколькими таблицами, поэтому я хочу, чтобы это было динамично
(User::whereNotNull('column')->count() / User::count()) * 100 или какая у вас модель...
$pos_info = DB::select(DB::raw('ПОКАЗАТЬ КОЛОННЫ ИЗ ресурса')); $pos_info_act = DB::select(DB::raw('SELECT count(*) from resource WHERE * NOT NULL AND user_id = '.$resource->user_id)); $процент = ($pos_info_act/$pos_info)*100;






Вы можете попробовать следующий запрос,
select (sum(case when column is not null then 1 else 0 end)/sum(case when column is null then 1 else 0 end))*100 from tableName
Использование модельного запроса
$all = Resource::count();
$notNull = Resource::whereNotNull('your_field_name')->count();
$percent = ($notNull/$all)*100;
print_r($percent);
exit;
Использование запроса к БД
$all = DB::table('resource')->count();
$notNull = DB::table('resource')->whereNotNull('your_field_name')->count();
$percent = ($notNull/$all)*100;
print_r($percent);
exit;
Вам нужно указать любой столбец, который является нулевым или не нулевым
Если кому интересно, вот как я это сделал
private function complete_percentage($model, $table_name, $resource){
$pos_info = DB::select(DB::raw('SHOW COLUMNS FROM '.$table_name));
$base_columns = count($pos_info);
$not_null = 0;
foreach ($pos_info as $col){
$not_null += app('App\\'.$model)::selectRaw('SUM(CASE WHEN '.$col->Field.' IS NOT NULL THEN 1 ELSE 0 END) AS not_null')->where('user_id', '=', $resource->user_id)->first()->not_null;
}
return ($not_null/$base_columns)*100;
}
Если кому-то интересно, PD: извините, я говорю по-испански, воспользуйтесь переводчиком на английский.
Тестирование в Lavarel 6
//consulting specific user
$user = User::find(Auth::id());
//counters
$contadornull = 0;
$cantidadcampos = 0;
// using $user->getFillable() for return all fields the model
foreach ($user->getFillable() as $key => $campos) {
//exclude data were user not filliables
if ($campos != 'fotografia' && $campos != 'rango' && $campos != 'password' &&
$campos != 'estatus')
{
//count all fields
$cantidadcampos = $cantidadcampos + 1;
//count fields where value is null
if ($user->$campos != null)
{
$contadornull++;
}
}
}
//calculate percentage
$porcentaje = $contadornull / $cantidadcampos * 100;
Хотя ваш ответ может решить вопрос, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - Из обзора
объяснение находится в комментариях к коду. является действительным..?
Не могли бы вы показать нам атрибуты таблицы?