i have Post and User model with one to one relation and it works good:
//User.php public function post(){ return $this->hasOne(Post::class); } // Post.php public function user() { return $this->belongsTo(User::class); }
now i create API resources:
php artisan make:resource Post php artisan make:resource User
I need to return all post with an api call then i set my route:
//web.php: /resource/posts Route::get('/resource/posts', function () { return PostResource::collection(Post::all()); });
this is my Posts resource class:
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\Resource; use App\Http\Resources\User as UserResource; class Posts extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'slug' => $this->slug, 'bodys' => $this->body, 'users' => UserResource::collection($this->user), 'published' => $this->published, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
this is the error:
Call to undefined method Illuminate\Database\Query\Builder::mapInto()
if i remove:
'users' => UserResource::collection($this->user),
it's work but i need to include relations in my api json, i have read and followed the doc at https://laravel.com/docs/5.5/collections.
this is my User resource class:
```
namespace App\Http\Resources; use Illuminate\Http\Resources\Json\Resource; class User extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'user_id' => $this->user_id, 'name' => $this->name, 'lastname' => $this->lastname, 'email' => $this->email ]; } }
any ideas where am i wrong?
The problem is that you use UserResource::collection($this->user)
and you have just one element not a collection so you can replace it with new UserResource($this->user)
like this :
return [ 'id' => $this->id, 'title' => $this->title, 'slug' => $this->slug, 'bodys' => $this->body, 'users' => new UserResource($this->user), 'published' => $this->published, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ];
this problem is that you use UserResource::collection($this->user) its mean you are many users but and you have just one element not a collection so you can replace it with new UserResource($this->user)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With