Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

laravel APi resource Call to undefined method Illuminate\Database\Query\Builder::mapInto()

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?

like image 318
DaveIt Avatar asked Dec 08 '17 08:12

DaveIt


2 Answers

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, ]; 
like image 194
Maraboc Avatar answered Sep 19 '22 09:09

Maraboc


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)

like image 27
Amirex Avatar answered Sep 18 '22 09:09

Amirex