在 json 内返回 laravel 关系
Returning laravel realtionship within json
我目前正在这样做,正如标题所说:
$user = User::where('username', request('username'))->first();
$posts = [];
$comments = [];
foreach($user->posts as $post){
foreach($post->comments as $comment){
array_push($comments, [
'id' => $comment->id,
'body' => $comment->body,
'user' => $comment->user->only(['name', 'id']),
]);
}
array_push($posts, [
'title' => $post->title,
'id' => $post->id,
'body' => $post->body,
'comments' => $comments,
]);
}
return response()->json([
'user' => $user->only(['name', 'avatar', 'age']),
'posts' => $posts,
]);
是否有更短的方法,例如:
$user->only(['name', 'avatar', 'age'])->withPostsOnly(['id', 'title', 'body'])->withCommentsOnly(['id', 'body']);
我知道有一种方法可以在 return 这些数据部分的模型中创建方法,然后像上面一样使用它,但更短。
但是有什么方法可以使用类似 getNameAttribute($value)
的关系,所以我可以说:
$user->only(['id', 'name', 'age', 'posts'])
;
在帖子值中,我需要拥有所有帖子和关系数据,例如评论和与评论相关的用户。
基本上在用户模型中:
public function posts() {
return $this->hasMany('App/Post')->only('id', 'title', 'body', 'comments');
}
并在 Post 模型内:
public function comments() {
return $this->hasMany('App/Comment')->only('id', 'body', 'user');
}
里面评论模型:
public function comments() {
return $this->belongsTo('App/User')->only('id', 'name');
}
谢谢
老实说,您可能把它复杂化了。
$user = User::where('username', request('username'))->first();
$user->load(['posts.comments']);
return response()->json($user);
这可能是一个简化版本,但仍然应该表明您可以只在模型上加载关系。
我目前正在这样做,正如标题所说:
$user = User::where('username', request('username'))->first();
$posts = [];
$comments = [];
foreach($user->posts as $post){
foreach($post->comments as $comment){
array_push($comments, [
'id' => $comment->id,
'body' => $comment->body,
'user' => $comment->user->only(['name', 'id']),
]);
}
array_push($posts, [
'title' => $post->title,
'id' => $post->id,
'body' => $post->body,
'comments' => $comments,
]);
}
return response()->json([
'user' => $user->only(['name', 'avatar', 'age']),
'posts' => $posts,
]);
是否有更短的方法,例如:
$user->only(['name', 'avatar', 'age'])->withPostsOnly(['id', 'title', 'body'])->withCommentsOnly(['id', 'body']);
我知道有一种方法可以在 return 这些数据部分的模型中创建方法,然后像上面一样使用它,但更短。
但是有什么方法可以使用类似 getNameAttribute($value)
的关系,所以我可以说:
$user->only(['id', 'name', 'age', 'posts'])
;
在帖子值中,我需要拥有所有帖子和关系数据,例如评论和与评论相关的用户。
基本上在用户模型中:
public function posts() {
return $this->hasMany('App/Post')->only('id', 'title', 'body', 'comments');
}
并在 Post 模型内:
public function comments() {
return $this->hasMany('App/Comment')->only('id', 'body', 'user');
}
里面评论模型:
public function comments() {
return $this->belongsTo('App/User')->only('id', 'name');
}
谢谢
老实说,您可能把它复杂化了。
$user = User::where('username', request('username'))->first();
$user->load(['posts.comments']);
return response()->json($user);
这可能是一个简化版本,但仍然应该表明您可以只在模型上加载关系。