Возвращение Laravel RealShip в JSON - PullRequest
0 голосов
/ 10 декабря 2018

В настоящее время я делаю это, поскольку заголовок говорит так:

$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']);

Я знаю, что есть способ сделатьметоды внутри моделей, которые возвращают эти части данных и затем используют их так же, как и выше, но более короткие.

Но есть ли способ использовать что-то вроде getNameAttribute($value) для отношений, поэтому я могу сказать:

$user->only(['id', 'name', 'age', 'posts']);

И в значении сообщений мне нужно иметь все сообщения и данные о взаимоотношениях, такие как комментарии и пользователи, связанные с комментариями.

Так что в основном в модели пользователя:

public function posts() {
  return $this->hasMany('App/Post')->only('id', 'title', 'body', 'comments');
}

А внутри Модель поста:

public function comments() {
  return $this->hasMany('App/Comment')->only('id', 'body', 'user');
}

И внутри Модель комментария:

public function comments() {
  return $this->belongsTo('App/User')->only('id', 'name');
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я думаю, что это поможет

$q = User::with(['posts' => function ($query) {
        $query->with('comments');
    }])->get();

Если вы хотите конкретного пользователя

$q = User::where('username', request('username')->with(['posts' => function ($query) {
        $query->with('comments');
    }])->get();
0 голосов
/ 10 декабря 2018

Вы, вероятно, слишком усложняете это, если честно.

$user = User::where('username', request('username'))->first();
$user->load(['posts.comments']);
return response()->json($user);

Возможно, это упрощенная версия, но она все же должна указывать, что вы можете просто загружать отношения на моделях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...