Laravel красноречивые отношения не будут работать должным образом при поиске по id - PullRequest
1 голос
/ 12 июля 2020

В настоящее время у меня есть 3 таблицы:

Posts:
-id
-text
-user_id
Comments:
-id
-text
-post_id
-user_id
Likes:
-id
-user_id
-comment_id

Я хочу получать как Комментарии, так и лайки на эти комментарии на моем show() контроллере сообщений. Этот код в моем Models, похоже, работал при использовании all(), однако он полностью ломается, когда я пытаюсь выполнить поиск по id. Он всегда возвращает все Posts, хотя должен получить только один.

class Posts extends Model
{
    public function comments(){
        return $this->hasMany('App\Models\Comments', 'post_id', 'id');
    }
    public function comment_likes(){
        return $this->hasManyThrough(
            '\App\CommentLikes',
            '\App\Models\Comments',
            'post_id', 'comment_id', 'id'
        );
    }
}

И код контроллера:

  public function show($id){
        $query =\App\Models\Posts::find($id)->with('comments')->with('comment_likes')->get();
        if(is_null($query)){
            return response()->json(['Not found'], 404);

        }
        return response()->json($query, 200);
    }

Это вообще правильный способ сделать это?

1 Ответ

1 голос
/ 14 июля 2020

Вы портите построители запросов и модели, последовательность вызовов, которая у вас сейчас есть, будет выполнять новый ->get() запрос из модели, поэтому возвращаются несколько сообщений.

Это происходит, когда ->find() выполняет запрос , возвращает 1 элемент, где id - параметр. Теперь это модель Eloquent, поэтому вы не должны называть ее with() и get(). Вы сделаете это, и будет выполнен новый запрос для выбора всех сообщений.

Если вы измените порядок, он должен работать должным образом.

\App\Models\Posts::with('comments')->with('comment_likes')->find($id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...