私は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
];
}
}
私が間違っているアイデアはありますか?
問題は、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,
];
この問題は、UserResource :: collection($ this-> user)を使用することです。つまり、多くのユーザーですが、コレクションではなく要素が1つしかないため、新しいUserResource($ this-> user)に置き換えることができます。