web-dev-qa-db-ja.com

laravel APi resource未定義のメソッドIlluminate \ Database \ Query \ Builder :: mapInto()への呼び出し

私は1対1の関係を持つPostとUserモデルがあり、それはうまく機能します:

//User.php

public function post(){
    return $this->hasOne(Post::class);
}


// Post.php

public function user() {
    return $this->belongsTo(User::class);
}

今、私はAPIリソースを作成します:

php artisan make:resource Post
php artisan make:resource User

私はすべての投稿をAPIコールで返す必要があり、次にルートを設定します:

//web.php: /resource/posts

Route::get('/resource/posts', function () {
    return PostResource::collection(Post::all());
});

これは私の投稿リソースクラスです。

<?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,
    ];

}
}

これはエラーです:

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

私が削除した場合:

'users' => UserResource::collection($this->user),

それは仕事ですが、私はAPI jsonに関係を含める必要があります。私は https://laravel.com/docs/5.5/collections のドキュメントを読んで従った.

これは私のユーザーリソースクラスです。

`` `

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

私が間違っているアイデアはありますか?

13
DaveIt

問題は、UserResource::collection($this->user)を使用し、コレクションではなく要素が1つしかないため、次のようにnew UserResource($this->user)に置き換えることができることです。

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,
];
46
Maraboc

この問題は、UserResource :: collection($ this-> user)を使用することです。つまり、多くのユーザーですが、コレクションではなく要素が1つしかないため、新しいUserResource($ this-> user)に置き換えることができます。

0
Amirex