Пагинация Laravel с ошибкой возврата ресурса Json - PullRequest
0 голосов
/ 24 октября 2018

У меня есть этот ответ JSON.В разделе data мне нужно получить только uID и email .Я пытаюсь сделать это с помощью JsonResource, но выдает ошибку.

Это json-ответ без JsonResource

{
        "current_page": 1,
        "data": [
            {
                "uID": 1,
                "name": "supun",
                "email": "supun@gmail.com",
                "email_verified_at": null,
                "dob": null,
                "contactNo": null,
                "fbID": null,
                "googleID": null,
                "bloodGroup": null,
                "height": null,
                "weight": null,
                "lID": 1,
                "sID": 1,
                "created_at": "2018-10-24 02:41:47",
                "updated_at": "2018-10-24 02:41:47",
                "deleted_at": null
            },
            {
                "uID": 4,
                "name": "supun",
                "email": "supun1@gmail.com",
                "email_verified_at": null,
                "dob": null,
                "contactNo": null,
                "fbID": null,
                "googleID": null,
                "bloodGroup": null,
                "height": null,
                "weight": null,
                "lID": 1,
                "sID": 1,
                "created_at": "2018-10-24 02:52:17",
                "updated_at": "2018-10-24 02:52:17",
                "deleted_at": null
            }
        ],
        "first_page_url": "http://127.0.0.1:8000/api/users?page=1",
        "from": 1,
        "last_page": 3,
        "last_page_url": "http://127.0.0.1:8000/api/users?page=3",
        "next_page_url": "http://127.0.0.1:8000/api/users?page=2",
        "path": "http://127.0.0.1:8000/api/users",
        "per_page": 2,
        "prev_page_url": null,
        "to": 2,
        "total": 5
    }

Это ответ, который мне нужно создать с помощью jsonresource

{
        "current_page": 1,
        "data": [
            {
                "uID": 1,
                 "email": "supun@gmail.com"

            },
            {
                "uID": 4,
                "email": "supun1@gmail.com"
            }
        ],
        "first_page_url": "http://127.0.0.1:8000/api/users?page=1",
        "from": 1,
        "last_page": 3,
        "last_page_url": "http://127.0.0.1:8000/api/users?page=3",
        "next_page_url": "http://127.0.0.1:8000/api/users?page=2",
        "path": "http://127.0.0.1:8000/api/users",
        "per_page": 2,
        "prev_page_url": null,
        "to": 2,
        "total": 5
    }

Это мой пользователь UserController

namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use App\User;
    use Illuminate\Support\Facades\Auth;
    use  App\Http\Resources\Users as GetAllUsersResource;
    use Validator;
    class UserController extends Controller {


        public function usersApi( Request $request ) {

            $userInfo = User::paginate(2);


            $output = new  GetAllUsersResource($userInfo);

            return response()->json($output, $this->successStatus);




            // return response()->json(['status'  => true,
            //                           'message' => 'done',
            //                          'data'    => $output
            // ], $this->successStatus);
        }


    }

а это мой JsonResource

namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Users extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
    //return parent::toArray($request->data);
        return [
       'uID' =>$this->uID,
         'email' =>$this->email,
          ];
    }
}

Этоошибка, которую я получил после добавления ее в JsonResource

 "message": "Undefined property: Illuminate\\Pagination\\LengthAwarePaginator::$uID",
    "exception": "ErrorException",
    "file": "E:\\xampp\\htdocs\\myworks\\pharmeasylk\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Resources\\DelegatesToResource.php",
    "line": 120,

Я пробую много других способов, но безуспешно.это работает только в том случае, если пользователь возвращает только одну строку.но нумерация страниц содержит много пользовательских данных и ссылок на данные.Если некоторые могут помочь мне с этим.большая помощь.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Похоже, что вы передаете коллекцию классу Illuminate\Http\Resources\Json\JsonResource (который ожидает получить один объект) вместо того, чтобы передать его классу Illuminate\Http\Resources\Json\ResourceCollection, который ожидает получить коллекцию.

Из документов:

Помимо создания ресурсов, преобразующих отдельные модели, вы можете создавать ресурсы, отвечающие за преобразование коллекций моделей.Это позволяет вашему ответу включать ссылки и другую мета-информацию, относящуюся ко всей коллекции данного ресурса.

Чтобы создать коллекцию ресурса, вы должны использовать флаг --collection при создании ресурса.Или включение слова Collection в имя ресурса будет указывать Laravel, что он должен создать ресурс коллекции.Ресурсы коллекции расширяют класс Illuminate \ Http \ Resources \ Json \ ResourceCollection:

php ремесленник make: ресурс Users --collection

php ремесленник make: ресурс UserCollection

https://laravel.com/docs/5.7/eloquent-resources#generating-resources

Если вы не делаете ничего необычного для преобразования своей коллекции, это также может работать без изменения класса JsonResource:

$output = GetAllUsersResource::collection($userInfo);
0 голосов
/ 24 октября 2018

что делает метод __construct() в классе GetAllUsersResource

$output = new  GetAllUsersResource($userInfo);

, возможно, вы захотите сделать это вместо этого!?

  $output = new  GetAllUsersResource($userInfo->items());
...