ソースを参照

Добавлена пагинация для получения всех персонажей из БД

ilg2005 4 ヶ月 前
コミット
303ddf7ce3
1 ファイル変更35 行追加15 行削除
  1. 35 15
      app/Http/Controllers/CharController.php

+ 35 - 15
app/Http/Controllers/CharController.php

@@ -9,35 +9,55 @@ use App\Models\Char\CharCashItem_OutputBox;
 class CharController extends Controller
 {
     /**
-     * Получение всех персонажей из базы данных.
+     * Получение всех персонажей из базы данных с пагинацией.
      *     * 
      * @return \Illuminate\Http\JsonResponse
      */
-    public function GetAllCharacters()
+    public function GetAllCharacters(Request $request)
     {
-        // Получаем всех персонажей
-        $characters = CharBase::all();
+        // Количество элементов на странице. Можно управлять с клиента, передавая GET-параметр ?per_page=N
+        $perPage = $request->input('per_page', 15);
 
-        // Проверяем, найдены ли персонажи
-         if($characters->isEmpty()){
-            return response()->json(['characters' => [], 'code' => -2, 'msg' => 'Characters not found.'], 200);
-        }        
+        // Получаем пагинированные данные
+        $charactersPaginator = CharBase::paginate($perPage);
 
-        // Возвращаем только DBKey, Name, Level, AccountName
-        $characters = $characters->map(function ($character) {
+        // Если персонажей нет вообще
+        if ($charactersPaginator->total() === 0) {
+            return response()->json(['characters' => (object)[], 'code' => -2, 'msg' => 'Characters not found.'], 200);
+        }
+
+        // Трансформируем коллекцию текущей страницы, чтобы вернуть только нужные поля
+        $transformedCharacters = $charactersPaginator->getCollection()->map(function ($character) {
             return [
                 'DBKey' => $character->DBKey,
                 'Name' => $character->Name,
                 'Level' => $character->Level,
                 'AccountName' => $character->AccountName
             ];
-        }); 
+        });
 
-        return response()->json([
+        // Собираем кастомный ответ с стандартным объектом пагинации Laravel
+        $paginatedResponse = [
             'code' => 0,
             'msg' => 'Characters successfully received.',
-            'characters' => $characters
-        ], 200);
+            'characters' => [
+                'current_page' => $charactersPaginator->currentPage(),
+                'data' => $transformedCharacters,
+                'first_page_url' => $charactersPaginator->url(1),
+                'from' => $charactersPaginator->firstItem(),
+                'last_page' => $charactersPaginator->lastPage(),
+                'last_page_url' => $charactersPaginator->url($charactersPaginator->lastPage()),
+                'links' => $charactersPaginator->linkCollection()->toArray(),
+                'next_page_url' => $charactersPaginator->nextPageUrl(),
+                'path' => $charactersPaginator->path(),
+                'per_page' => $charactersPaginator->perPage(),
+                'prev_page_url' => $charactersPaginator->previousPageUrl(),
+                'to' => $charactersPaginator->lastItem(),
+                'total' => $charactersPaginator->total(),
+            ]
+        ];
+
+        return response()->json($paginatedResponse, 200);
     }
 
     /**
@@ -114,4 +134,4 @@ class CharController extends Controller
             'msg' => 'Items successfully sent.'            
         ], 200);
     }
-}
+}