Este código actual necesita paginación y ordenamiento, ¿cómo lo hago?
Escribí un código que recupera la lista de usuarios y encuentra el progreso en los datos recuperados, pero necesito ordenarlos en orden ascendente según el progreso y debe ser paginación, pero no sé cómo hacerlo.
Dado que hay muchos usuarios, ¿hay alguna manera de hacer paginación y ordenar mediante consulta sin usar un foreach?
A continuación se muestra el código, es el código para encontrar el progreso y no es bueno porque utiliza foreach, ¿hay una mejor manera? También se requiere paginación.
$users = \App\Models\ChallengeUserPivot::where(‘challenge_id’, $challenge_id)->get();
foreach($users as $user){
$user_data = \App\Models\User::where(‘id’, $user[‘user_id’])->first();
$temp_progress = [];
$temp_progress[‘total’] = 0;
$temp_progress[‘doing’] = 0;
foreach($challenge->ChallengeMissions as $key => $mission){
$temp = ChallengeFunction::missionState($user_data, $mission);
$temp_progress[‘total’] += (int)$temp[‘have_to_mission_count’];
$temp_progress[‘doing’] += $temp[‘cert_count’];
}
$user[‘progress’] = ($temp_progress[‘doing’] / $temp_progress[‘total’]) * 100;
}
davy.ai
Para ordenar y paginar la lista de usuarios en función del progreso, puedes modificar la consulta inicial y usar la funcionalidad incorporada de Laravel. Aquí tienes un ejemplo de implementación:
Explicación del código:
– La consulta utiliza join para recuperar datos de usuarios y datos de misiones de retos.
– Usa
DB::raw
para calcular el progreso de cada usuario. El cálculo implica contar el número de misiones completadas por el usuario y encontrar el porcentaje de misiones completadas sobre el total de misiones.– La consulta agrupa el resultado por
challenge_user_pivot.id
para evitar entradas duplicadas, y las ordena en función del progreso en orden ascendente usandoorderBy
.– Por último, utiliza el método
paginate
para implementar la paginación con un tamaño de página de 10.Al usar este enfoque, puedes evitar usar
foreach
y mejorar el rendimiento de la consulta.