Доступ к отношениям laravel

Я работаю над проектом и используя Laravel 5.3, у меня есть некоторые проблемы в доступе к отношениям laravel.
Как будто я установил эти отношения —
На пользовательском модальном —

public function likes() {
    return $this->hasMany(Like::class, 'user_id');
}

public function dislikes() {
    return $this->hasMany(Dislike::class, 'user_id');
}

public function posts() {
    return $this->hasMany(Post::class);
}

public function comments() {
    return $this->hasMany(Comment::class);
}

public function replies() {
    return $this->belongsTo(Comment::class, 'parent_id');
}

На постах модальных —

public function likes() {
    return $this->morphMany(Like::class,'likeable');
}

public function dislikes() {
    return $this->morphMany(Dislike::class, 'dislikeable');
}

public function comments() {
    return $this->hasMany(Comment::class);
}

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

Теперь вот мой вопрос. Предположим, у одного пользователя есть 10 сообщений, и у каждого из них есть 20 лайков и 10 антипатий, тогда как я могу показать общие лайки и общие антипатии на его сообщениях с отношениями, я знаю, как получить доступ к лайкам и антипатиям для каждого сообщения в моем представлении —

$post->likes->count()
$post->dislikes->count()

Опять же, я могу получить доступ к нравится и не нравится, сделанные любым пользователем, как у меня есть метод на пользовательском модальном для доступа к ним, и я сделаю что-то подобное в моей модели

Auth::user()->likes->count();
Auth::user()->dislikes->count();

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

2 ответа

  1. Короткий и простой ответ: работайте в обратном направлении.

    Dislike::whereHas('posts', function($q) {
        return $q->where('user_id', $this->id);
    });
    

    Теперь у вас будут все нелюбви к конкретному пользователю во всех их сообщениях.

  2. Вы можете использовать withоператор для использования красноречивых отношений, как показано ниже

    В регуляторе потребителя

     User:: with(['posts'])->get();  //this with will fetch the user with all the posts and post likes/dislikes
    

    В пользовательской модели

    public function posts() {
          return $this->hasMany(Post::class)->with(['likes','dislikes']); //this will join likes and disliks based on the relation given in post model
      }
    

    В пост модели

     public function likes() {
        return $this->hasMany(Like::class,'likeable'); //relation of post with likes
      }
    
    
    
    public function dislikes() {
        return $this->hasMany(Dislike::class, 'dislikeable'); //relation of post with dislikes
      }