es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;
}

Tags:  , , ,

Answer

  1. Avatar for 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:


    $challengeUsers = \App\Models\ChallengeUserPivot::where('challenge_id', $challenge_id) ->join('users', 'users.id', '=', 'challenge_user_pivot.user_id') ->join('challenge_missions', 'challenge_missions.challenge_id', '=', 'challenge_user_pivot.challenge_id') ->select('challenge_user_pivot.*', DB::raw('(SUM(IF(users_certification.transaction_type = "certification" AND users_certification.count >= challenge_missions.have_to_count, 1, 0)) / COUNT(challenge_missions.id)) * 100 AS progress')) ->groupBy('challenge_user_pivot.id') ->orderBy('progress', 'asc') ->paginate(10);

    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 usando orderBy.
    – 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.

Comments are closed.